VC2005中socket多线程通信,accept线程无法正常接收数据
在主线程中创建Listensocket,并bind、listen
主线程创建一线程while(1)死循环负责accept客户端connect请求,代码如下
while (1)
{
if ((NewConnection = accept(ListeningSocket, NULL,
NULL)) == INVALID_SOCKET)
{
continue;
}
Ret = recv(NewConnection, DataBuffer, DATE_BUFFER_SIZE, 0);
}
问题来了,调试的时候客户端连接服务器发送数据,客户端返回值表示send成功
不过在服务器端recv处设置断点,发现有时候客户端发送成功了,但是服务器端没有执行到recv,没有接收数据,一直在accept处循环
这种情况不是一直出现,有时候重启服务器端进程一切都正常,有时候重启了就发生上面的问题
而且只要服务器端进程第一次recv成功,以后都可以正常recv
第一次recv不到,以后的都没有recv到
[解决办法]
你都没退出循环哈
if ((NewConnection = accept(ListeningSocket, NULL,NULL)) == INVALID_SOCKET){continue;}else{ break;}
[解决办法]
NewConnection = accept(ListeningSocket, NULL,
NULL)
这个函数的第三个参数被默认为0,那么系统认为你的存储空间为0,当然是错误了,
lenth = sizeof(sockaddr_in) //*需要放在循环里面*
socket_new = accept(socket, (struct sockaddr *)&saddr_c, &lenth);
if (socket_new == -1) {
if (errno == EINTR) {
continue;
}
return -1;
}
[解决办法]
楼上的正解。
int newSocket; // the new socket file descriptor returned by the accept systme call // the length of the client's address int clientAddressLen = sizeof(struct sockaddr_in); struct sockaddr_in clientAddress; // Address of the client that sent data // Accepts a new client connection and stores its socket file descriptor if ((newSocket = accept(m_hSocket, (struct sockaddr *)&clientAddress,&clientAddressLen)) == -1){// 错误处理}// 创建线程进行消息处理
[解决办法]
你的客户端是发送数据以后就关闭socket了吗?