在主线程中创建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到
主线程创建一线程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;
}
那你就得
if ((NewConnection = accept(ListeningSocket, NULL,
NULL)) == INVALID_SOCKET)
{
continue;
}
createthread(...)...;
创建线程来接收了
因为程序执行不下去啊
象你上面的代码都无法执行到createthread(...)
NULL)) == INVALID_SOCKET)
{
//去掉continue;
}
if(NewConnection != INVALID_SOCKET )
Ret = recv(NewConnection, DataBuffer, DATE_BUFFER_SIZE, 0);
因为有可能,先运行循环再收到数据,那样就下不来了
主要是你的NewConnection每次都被重置,所以你要用个数组什么的
不过主线程被阻塞了,UI没办法响应
最好的办法是创建一个线程来接收,accept最好也要创建线程
你这样都不合理
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;
}
// 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)
{
// 错误处理
}// 创建线程进行消息处理
accept接收的一直是无效连接,尽管客户端显示connent和send成功
顺便说下,测试的时候客户端和服务器端在一台机器上
和这个没关系,accept后面连个参数可以为NULL
恩,客服端send以后就关闭了
send虽然有延时,不过和这里出现的问题没有关系
服务器端显示CLOSE_WAIT
主线程创建的ListenSocket是一个临时变量,传到listen线程后已经被系统释放了
不过也很奇怪,客服端竟然连接发送成功