Я хотел бы изменить socket class Я использую, чтобы принять бесконечное количество клиентов. На данный момент он позволяет одному клиенту, и как только клиент отключит сервер, выйдет.Сделать сервер сокетов принимать несколько клиентов
#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(), так что он постоянно ждет новых клиентов для подключения, и как только они делают, создать новую тему для него (клиента) или сокет новый обработчик (что бы это ни было).
Я нашел this нить, чтобы быть информативной, но мне не хватает знаний о сокетах, чтобы реально реализовать ее в приведенном выше коде.
Ответ гласит 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
?
Прошу прощения за то, что не смог показать больше усилий с моей стороны, мне не нравится встречаться как ленивый. Но за все часы, которые я искал, и проб и ошибок, вытекающих из этого, у меня не так много, чтобы показать это.
Вы можете, например, породить новый поток для каждого подключенного клиента. – Cyclonecode
Я бы порекомендовал boost asio. – Bashwork
Но в какой момент я бы разблокировал подключенного клиента к новому потоку? Например .. до того, как я установил порт слушателя, то есть каждому клиенту понадобится его собственный порт или после него. И если потом, как я могу заставить класс принимать сообщения асинхронно? Я действительно потерял 100% от того, как это сделать. – natli