Я бы хотел изменить класс сокета , который я использую для приема бесконечного количества клиентов.На данный момент он позволяет одному клиенту и после этого клиента отключить сервер.
#include "stdafx.h"
#include "mySocket.h"
#include "myException.h"
#include "myHostInfo.h"
void main()
{
#ifdef WINDOWS_XP
// Initialize the winsock library
WSADATA wsaData;
try
{
if (WSAStartup(0x101, &wsaData))
{
myException* initializationException = new myException(0,"Error: calling WSAStartup()");
throw initializationException;
}
}
catch(myException* excp)
{
excp->response();
delete excp;
exit(1);
}
#endif
// get local server information
myHostInfo uHostAddress;
string localHostName = uHostAddress.getHostName();
string localHostAddr = uHostAddress.getHostIPAddress();
cout << "------------------------------------------------------" << endl;
cout << " My local host information:" << endl;
cout << " Name: " << localHostName << endl;
cout << " Address: " << localHostAddr << endl;
cout << "------------------------------------------------------" << endl;
// open socket on the local host
myTcpSocket myServer(PORTNUM);
cout << myServer;
myServer.bindSocket();
cout << endl << "server finishes binding process... " << endl;
myServer.listenToClient();
cout << "server is listening to the port ... " << endl;
// wait to accept a client connection.
// processing is suspended until the client connects
cout << "server is waiting for client connecction ... " << endl;
myTcpSocket* client; // connection dedicated for client communication
string clientHost; // client name etc.
client = myServer.acceptClient(clientHost);
cout << endl << "==> A client from [" << clientHost << "] is connected!" << endl << endl;
while(1)
{
//Send message to the client
client->sendMessage(std::string("Test"));
// receive from the client
string clientMessageIn = "";
int numBytes = client->recieveMessage(clientMessageIn); //Get message from client, non-blocking using select()
if ( numBytes == -99 ) break;
if(clientMessageIn != "")
{
std::cout << "received: " << clientMessageIn << std::endl; //What did we receive?
/* Do somethign with message received here */
}
}
#ifdef WINDOWS_XP
// Close the winsock library
try
{
if (WSACleanup())
{
myException* cleanupException = new myException(0,"Error: calling WSACleanup()");
throw cleanupException;
}
}
catch(myException* excp)
{
excp->response();
delete excp;
exit(1);
}
#endif
}
Как изменить функцию main (), чтобы она постоянно ожидала подключения новых клиентов, и как только онисделайте, создайте новый поток для него (клиента) или новый сокет обработчика (что бы это ни было).
Я нашел этот поток информативным, но мне не хватаеттребуется знание сокетов, чтобы фактически реализовать его в приведенном выше коде.
Ответ гласит: When doing socket communication, you basically have a single listener socket for all incoming connections, and multiple handler sockets for each connected client.
Итак, я предполагаю, что в моем коде;
myTcpSocket myServer(PORTNUM);
myServer.bindSocket();
myServer.listenToClient();
Было быlistener socket
Но где / как я могу раскошелиться на клиента, который подключается к handler socket
?
Извините, что не смог проявить больше усилий с моей стороны,Я не люблю показаться ленивым.Но за все часы, которые я искал, и из-за этого были проб и ошибок, мне особо нечего показать.