多线程,recv总会停住
请版上的各位高手帮忙看看,感谢万分!
写的一个邮件服务器,每次接到邮件客户端的连接请求,会开启一个新线程,然后从邮件客户端recv命令,并执行,如此循环,直至quit命令,但发送大邮件(超过3M)后,总是在recv()的时候停住。
我的服务器系统和邮件客户端在同一台机器上,原先没有对客户端连接connected的判断,看到有人说可以用select解决,所以加上了,结果问题还是一样,通过调试,可以看到邮件已经向客户端send发送完毕
while(TRUE){
memset(buf, '\0', 1023);
if(!IsConnected(bConnected) || !bConnected || recv(sock, buf, 1023, 0) <= 0){
AfxMessageBox(...);
sprintf(buf, "QUIT");
}
if(strnicmp(buf, "LIST", 4) == 0){
....
}...
else if(strnicmp(buf, "RETR", 4) == 0){
Email->Send();
}...
else if(strnicmp(buf, "QUIT", 4) == 0){
close(sock);
break;
}...
}
BOOL ServiceClient::IsConnected(BOOL &bConnected)
{
timeval timeout = {0, 0};
fd_set servfds;
FD_ZERO(&servfds);
FD_SET(sock, &servfds);
int nStatus = select(0, &servfds, &servfds, NULL, &timeout);
if (nStatus == SOCKET_ERROR)
return FALSE;
else{
bConnected = !(nStatus == 0);
return TRUE;
}
}
写的一个邮件服务器,每次接到邮件客户端的连接请求,会开启一个新线程,然后从邮件客户端recv命令,并执行,如此循环,直至quit命令,但发送大邮件(超过3M)后,总是在recv()的时候停住。
我的服务器系统和邮件客户端在同一台机器上,原先没有对客户端连接connected的判断,看到有人说可以用select解决,所以加上了,结果问题还是一样,通过调试,可以看到邮件已经向客户端send发送完毕
while(TRUE){
memset(buf, '\0', 1023);
if(!IsConnected(bConnected) || !bConnected || recv(sock, buf, 1023, 0) <= 0){
AfxMessageBox(...);
sprintf(buf, "QUIT");
}
if(strnicmp(buf, "LIST", 4) == 0){
....
}...
else if(strnicmp(buf, "RETR", 4) == 0){
Email->Send();
}...
else if(strnicmp(buf, "QUIT", 4) == 0){
close(sock);
break;
}...
}
BOOL ServiceClient::IsConnected(BOOL &bConnected)
{
timeval timeout = {0, 0};
fd_set servfds;
FD_ZERO(&servfds);
FD_SET(sock, &servfds);
int nStatus = select(0, &servfds, &servfds, NULL, &timeout);
if (nStatus == SOCKET_ERROR)
return FALSE;
else{
bConnected = !(nStatus == 0);
return TRUE;
}
}
...全文
相关推荐
socket_recv函数使用心得.
这是一份关于 socket_recv的文档,相信对想学习 socket_recv的同学一定有很大的帮助!
第 20 篇:Socket 编程:如何用代码说话
网络基础系列第 20 篇。上一篇我们讲了 DNS:浏览器先把域名解析成 IP,才知道包该往哪里发。今天我们完成阶段 1 的最后一篇,把前面讲过的 IP、端口、TCP、UDP、HTTP、DNS 连接到代码里:Socket 编程。
MFC上位机TCP通信实战:从Socket原理到协议解析与排错全指南
TCP/IP作为互联网与工业控制领域最基础的传输协议,其可靠的数据传输能力为设备间的通信提供了坚实保障。Winsock API是Windows平台下实现Socket通信的标准接口。上位机(尤其是工业场景下的工控上位机)与PLC、单片机等下位机的交互,往往面临数据粘包半包、编码转换、线程安全等经典工程问题。MFC框架与Winsock的结合,提供了一套切实可行的落地方案。从阻塞与非阻塞模型的选择、CString与char*的编码转换,到自定义帧协议、循环缓冲区的解析处理,每一步都直接影响系统的稳定性。本文基于多
socket send和recv详解
send 和recv 详解,绝对好东西。
Software caused connection abort: recv failed
Software caused connection abort: recv failed


网络编程
