【发布时间】:2022-01-15 07:19:03
【问题描述】:
我有一个 client 1 发送一些 数据 到 服务器,我想 服务器 传输它data 到 client 2 而不是 client 1。有没有办法告诉服务器我们必须使用不同的客户端套接字,如果 client 1 发送数据不发送回 client 1 而是发送到 client 2 ?
当服务器接受 client 1 时,我尝试在其中放入一个列表,但由于某种原因,当服务器接受 client 2 时,它只计为 1 而不是 2 此函数处理来自客户端的缓冲区 无符号 __stdcall ClientSession(void* data) {
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
int iResult;
int iSendResult;
SOCKET ClientSocket = (SOCKET)data;
do
{
// recv buffer from the client
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0)
{
//iSendResult = send(ClientSocket, recvbuf, iResult, 0);
iSendResult = send_data(ClientSocket, recvbuf, iResult);
if (iSendResult == SOCKET_ERROR)
{
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
//receive from the clients
printf("Message %.*s\n", iResult, recvbuf);
}
else if (iResult == 0)
{
printf("Connection closing... \n");
}
else
{
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (iResult > 0);
//接受新客户
while (ClientSocket = accept(ListenSocket, (sockaddr*)&ClientSocket, NULL))
{
printf("Accepted");
if (ClientSocket == INVALID_SOCKET)
{
printf("accept failed with errir: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
unsigned threadID;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ClientSession, (void*)ClientSocket, 0, &threadID);
// try add new clients to a list
list<SOCKET> a;
a.push_back(ClientSocket);
for (SOCKET i : a) {
cout << "Hi I'm\n" << ClientSocket;
cout << "MY SIZE\n" << a.size();
}
}
enter code here
【问题讨论】:
-
我认为这里的问题是 List
是 while 内的局部变量。尝试将它放在全局或类范围内,一切都应该工作
标签: c++ networking tcpclient tcpserver