多线程,recv总会停住

joeytry joeytry 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请版上的各位高手帮忙看看,感谢万分!

写的一个邮件服务器,每次接到邮件客户端的连接请求,会开启一个新线程,然后从邮件客户端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;
}
}
...全文

相关推荐

评论 26
收藏 已收藏
分享
返回顶部
joeytry
网络编程 18,356 成员 64,161 内容