socket服务端与多个客户端多线程通信 ,但是服务端只能接到一次客户端发的信息

时间:2022-04-07 00:31:58
主函数
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
int len = sizeof(SOCKADDR);
int iRet = WSAStartup(MAKEWORD(1, 1), &wsaData);
SOCKET m_socket;
SOCKADDR_IN addrClient;
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
WSACleanup();
return 0;
}
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = htonl(INADDR_ANY);
service.sin_port = htons(5000);

if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
{
closesocket(m_socket);
return 0;
}
else
printf("bind OK.\n");
if (listen(m_socket, 20) == SOCKET_ERROR)
printf("Error listening on socket.\n");
else
printf("listening ok.\n");
SOCKET AcceptSocket;
printf("Waiting for a client to connect...\n");
int i = 0;
while (1)
{
if (bThread67 == false)
{
AcceptSocket = SOCKET_ERROR;
while (AcceptSocket == SOCKET_ERROR)
{
AcceptSocket = accept(m_socket, (SOCKADDR*)&addrClient, &len);
}
printf_s("Client Connected. %s:%d\n", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port));

if (bThread67 == false)
{
if (hThread3 == NULL)
{
hThread3 = CreateThread(NULL, NULL, AnswerThread3,
(LPVOID)AcceptSocket, 0, &dwThreadId3);
}
}

if (bThread67 == false)
{
CloseHandle(hThread3);
}

Sleep(1000);   
closesocket(AcceptSocket);
i++;
printf("mount %d",i);
}
}
closesocket(m_socket);
return 0;
}

线程函数
DWORD WINAPI AnswerThread3(LPVOID lparam)
{
SOCKET ClientSocket = (SOCKET)(LPVOID)lparam;
//char szText[] = "您好!\r\n";
char recvBuf3[32];
char reStr3[32] = "";
int rd = (int)recv(ClientSocket, recvBuf3, 14, 0);
printf("\n连接返回结果%d\n", rd);
printf("\n67读取指令\n");
Sleep(2000);

for (int i = 0; i < recvBuf3[2] + 5; i++) printf("-%x- ", recvBuf3[i] & 0xff);
int i = 0;
bool xunhuantj = true;
if (xunhuantj) printf("\n67符和循环条件\n");
while (xunhuantj == true)
{


if (recvBuf3[0] == 0xffffffc0 && recvBuf3[11] == 0x67)
{

printf("\n67连接成功:\n");
bThread67 = true;
sThreadname = 67;

}
else
{
printf("67值不符%x\n", recvBuf3[11]);
xunhuantj = false;
printf("下次退出循环\n");
}
Sleep(1000);
i = i + 1;
}
::closesocket(ClientSocket);
return 0;

}

线程函数recv第一次成功,但是再调用recv或 send时无法接收或发送信息

7 个解决方案

#1


你只 recv了一次呀

#2


你在线程里面把bThread67设成true了,main里面的if (bThread67 == false)就永远进不去,当然就无法再accept了。

#3


DWORD WINAPI AnswerThread3(LPVOID lparam)
这个接受线程里要循环接受数据

#4


你这个是逻辑问题,单步调试吧    这个还是自己去理解socket的运行机制吧 ,

#5


建议先看Windows Socket五种I/O模型
否则这么折腾出来的东西,实际应用意义不大

#6


建议使用ace的socket通讯。

#7


boost也可以考虑,都是跨平台的。

#1


你只 recv了一次呀

#2


你在线程里面把bThread67设成true了,main里面的if (bThread67 == false)就永远进不去,当然就无法再accept了。

#3


DWORD WINAPI AnswerThread3(LPVOID lparam)
这个接受线程里要循环接受数据

#4


你这个是逻辑问题,单步调试吧    这个还是自己去理解socket的运行机制吧 ,

#5


建议先看Windows Socket五种I/O模型
否则这么折腾出来的东西,实际应用意义不大

#6


建议使用ace的socket通讯。

#7


boost也可以考虑,都是跨平台的。