我使用过C ++& Winsock2创建服务器和客户端应用程序。它目前通过创建单独的线程来处理多个客户端连接。
两个客户端连接到服务器。两者连接后,我需要仅向连接的第一个客户端发送消息,然后等待直到收到响应,向第二个客户端发送单独的消息。 麻烦的是,我不知道如何定位连接的第一个客户端。 我目前的代码接受两个连接,但邮件被发送到客户端2。
有人可以就如何使用Send()到特定的客户端给我这么想法吗?感谢
接受连接并启动新线程的代码
SOCKET TempSock = SOCKET_ERROR; // create a socket called Tempsock and assign it the value of SOCKET_ERROR
while (TempSock == SOCKET_ERROR && numCC !=2) // Until a client has connected, wait for client connections
{
cout << "Waiting for clients to connect...\n\n";
while ((ClientSocket = accept(Socket, NULL, NULL)))
{
// Create a new thread for the accepted client (also pass the accepted client socket).
unsigned threadID;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ClientSession, (void*)ClientSocket, 0, &threadID);
}
}
的ClientSession()
unsigned __stdcall ClientSession(void *data)
{
SOCKET ClientSocket = (SOCKET)data;
numCC ++; // increment the number of connected clients
cout << "Clients Connected: " << numCC << endl << endl; // output number of clients currently connected to the server
if (numCC <2)
{
cout << "Waiting for additional clients to connect...\n\n";
}
if (numCC ==2)
{
SendRender(); // ONLY TO CLIENT 1???????????
// wait for client render to complete and receive Done message back
memset(bufferReply, 0, 999); // set the memory of the buffer
int inDataLength = recv(ClientSocket,bufferReply,1000,0); // receive data from the server and store in the buffer
response = bufferReply; // assign contents of buffer to string var 'message'
cout << response << ". " << "Client 1 Render Cycle complete.\n\n";
SendRender(); // ONLY TO CLIENT 2????????????
}
return 0;
}
Sendrender()函数(向客户端发送渲染命令)
int SendRender()
{
// Create message to send to client which will initialise rendering
char *szMessage = "Render";
// Send the Render message to the first client
iSendResult = send(ClientSocket, szMessage, strlen(szMessage), 0); // HOW TO SEND ONLY TO CLIENT 1???
if (iSendResult == SOCKET_ERROR)
{
// Display error if unable to send message
cout << "Failed to send message to Client " << numCC << ": ", WSAGetLastError();
closesocket(Socket);
WSACleanup();
return 1;
}
// notify user that Render command has been sent
cout << "Render command sent to Client " << numCC << endl << endl;
return 0;
}
答案 0 :(得分:0)
您可以通过添加WaitForSingleObject(或WaitForMultipleObjects)调用为线程提供等待函数和控制函数。那些API调用暂停该线程,直到其他线程设置事件句柄。 API返回值告诉您设置了哪个事件句柄,您可以使用它来确定要采取的操作。
为每个线程使用不同的事件句柄。要将其传递给线程,您将需要一个包含事件句柄和您现在传递的套接字句柄的结构。将指向此结构的指针传递给线程实际上是一种传递两个参数的方法。
您的主线程需要使用CreateEvent来初始化线程句柄。然后在连接两个套接字后,它将设置一个事件(SetEvent),触发第一个线程。