recvfrom 再 closesocket后仍然阻塞

北漂17载 2010-02-05 06:04:53
我的udp socket再主窗口点击关闭后调用 shutdown(m_hUDPSocket, SD_BOTH); closesocket(m_hUDPSocket); 后等待接收线程退出,发现再个别的情况下 recvfrom线程一直不返回 导致程序死锁,有人遇到过这种情况么
...全文
268 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-05-17
  • 打赏
  • 举报
回复
结贴通知:
请lz注意结贴。。。。
Icedmilk 2010-03-03
  • 打赏
  • 举报
回复
我看了一下你的另外一个帖子,综合一下,觉得你确实可能有死循环存在。

recvfrom阻塞的时候,如果你在其他线程调用closesocket

recvfrom会返回 10004 (Interrupted function call,阻塞状态被打断,由于closesocket)
如果你检测到了10004错误,这是可以考虑退出

如果你没有退出,继续循环调用
recvfrom会立即返回 10038 (Socket operation on nonsocket,无效的socket)
如果你再不检测 这个10038错误,就会导致死循环了

我自己的代码就是由于没有检测错误而导致死循环

我建议你把错误检测做的仔细点
WizardK 2010-03-01
  • 打赏
  • 举报
回复
阻塞了吧?改为非阻塞的
北漂17载 2010-03-01
  • 打赏
  • 举报
回复
recvfrom 一个值为-1的?
北漂17载 2010-03-01
  • 打赏
  • 举报
回复
recvfrom 一个无效的值会导致阻塞么
Icedmilk 2010-02-21
  • 打赏
  • 举报
回复
我遇到过这个问题

我的感觉大致是这样的:

一般recvfrom都是写在循环之中

recvfrom之后会阻塞
阻塞期间如果你在其他线程调用了closesocket会导致recvfrom返回
这时候你要检测返回值,如果是由于调用closesocket而返回的,就要结束循环推出线程
如果你不做这个检测,虽然socket已经被关闭, 但是recvfrom可能在下次循环继续阻塞.
北漂17载 2010-02-21
  • 打赏
  • 举报
回复
引用 1 楼 conry 的回复:
退出前自己给自己发送一个消息,recvfrom就能收到消息,就会往下执行了

给自己发个包,然后关闭socket?
还是给自己发个包,收线程自己收到退出,等收线程退出了再关闭socket?
xwsn007 2010-02-07
  • 打赏
  • 举报
回复
MARK & UP
mazm_yanzhu 2010-02-06
  • 打赏
  • 举报
回复
ding
zyq5945 2010-02-05
  • 打赏
  • 举报
回复
//等待时间为9000毫秒
#define TIMEOUT_MICROSECONDS 9000
fd_set rfd;
struct timeval timeout;

FD_ZERO(&rfd);

timeout.tv_sec = TIMEOUT_MICROSECONDS / 1000;
timeout.tv_usec = TIMEOUT_MICROSECONDS % 1000;

FD_SET(m_hSocket,&rfd);
int nReady = select(0,&rfd,NULL,NULL,&timeout);

if( 0 == nReady || SOCKET_ERROR == nReady)
{
return ;
}
//这里就可以用recvfrom接收数据了
Conry 2010-02-05
  • 打赏
  • 举报
回复
退出前自己给自己发送一个消息,recvfrom就能收到消息,就会往下执行了

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧