recvfrom 再 closesocket后仍然阻塞

北漂17载 2010-02-05 06:03:09
我的udp socket再主窗口点击关闭后调用 shutdown(m_hUDPSocket, SD_BOTH); closesocket(m_hUDPSocket); 后等待接收线程退出,发现再个别的情况下 recvfrom线程一直不返回 导致程序死锁,有人遇到过这种情况么
...全文
630 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
losdaivy 2010-04-20
  • 打赏
  • 举报
回复
调用Closesocket()后,如果有未传完的数据,会断续传递,然后才关闭套接字
【天运子】 2010-04-19
  • 打赏
  • 举报
回复
用非阻塞模式
线程接受
jianggh_wuhee 2010-03-03
  • 打赏
  • 举报
回复
引用 11 楼 zhdf189 的回复:
用select模型,就不会阻塞了

我也觉得你这个问题用select模型比较好,在revfrom操作之前先判断一下是否有需要接收的数据。
WizardK 2010-03-03
  • 打赏
  • 举报
回复
循环RECVFROM,不要阻塞

BTW,LZ的昵称很好!
zhdf189 2010-03-03
  • 打赏
  • 举报
回复
用select模型,就不会阻塞了
Icedmilk 2010-03-03
  • 打赏
  • 举报
回复
我看了一下你的另外一个帖子,综合一下,觉得你确实可能有死循环存在。

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

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

如果你没有退出,继续循环调用
recvfrom会返回 10038 (Socket operation on nonsocket,无效的socket)

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

我建议你把错误检测做的仔细点
北漂17载 2010-02-07
  • 打赏
  • 举报
回复
最近遇到 断网的时候 tcp connet会成功 recv会失败的情况,后来怀疑是nod32的tcp劫持导致的,不知道这个又是个什么奇怪问题
北漂17载 2010-02-07
  • 打赏
  • 举报
回复
创建代码:
m_hUDPSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_hUDPSocket == INVALID_SOCKET)
{
return FALSE;
}

#ifdef WIN32
//避免10054号错误
#define IOC_VENDOR 0x18000000
#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
DWORD dwBytesReturned = 0;
BOOL bNewBehavior = FALSE;
WSAIoctl(m_hUDPSocket, SIO_UDP_CONNRESET,
&bNewBehavior, sizeof(bNewBehavior),
NULL, 0, &dwBytesReturned, NULL, NULL);
#endif

sockaddr_in lstruAddr;
memset(&lstruAddr,0,sizeof(lstruAddr));
lstruAddr.sin_family = AF_INET;
lstruAddr.sin_addr.s_addr = INADDR_ANY;
if (apLocalIp != NULL)
{
lstruAddr.sin_addr.s_addr = inet_addr(apLocalIp);
}
lstruAddr.sin_port = htons(awBindPort);

if (-1 == bind(m_hUDPSocket,(sockaddr*)&lstruAddr, sizeof(lstruAddr)))
{
closesocket(m_hUDPSocket);
m_hUDPSocket = INVALID_SOCKET;
return FALSE;
}
m_wBindedPort = awBindPort;
ASSERT(m_hUDPSocket != INVALID_SOCKET);
return TRUE;

关闭代码:

if (m_hUDPSocket != INVALID_SOCKET)
{
#ifdef WIN32
//调试时遇到win下 recv阻塞情况,原因未定,暂加shutdown
shutdown(m_hUDPSocket, SD_BOTH);

closesocket(m_hUDPSocket);
#else
//在Linux下如果不调用shutdown函数关闭套接字的读通道,
//则阻塞式的recvfrom函数就不会返回
shutdown(m_hUDPSocket, 0);
close(m_hUDPSocket);
#endif
m_hUDPSocket = INVALID_SOCKET;
}

接收线程:
liDataLen = recvfrom(m_hUDPSocket,lpRtpFrame->GetFramePtr(), \
DEF_MAX_RTP_PACK_LEN, 0, (sockaddr*)&loPeerAddr, &liAddrLen);

北漂17载 2010-02-07
  • 打赏
  • 举报
回复
没有死循环那么简单,多次调试过,打过断点 没有返回-1
xwsn007 2010-02-07
  • 打赏
  • 举报
回复
MARK
奔跑前行 2010-02-06
  • 打赏
  • 举报
回复
对 别乱用死锁。。。呵呵 你那个退出条件有没有判断,别则一直卡死在循环里面,而没有选择退出的。。。。
bragi523 2010-02-06
  • 打赏
  • 举报
回复
是否设置了线程退出条件,是否判断了recvfrom返回值等
要多少贴出一点代码
cnzdgs 2010-02-06
  • 打赏
  • 举报
回复
直接closesocket,不要shutdown,线程在recvfrom失败后主动退出。
猞猁狲 2010-02-05
  • 打赏
  • 举报
回复
不要乱用死锁这个名词,你这不是死锁了,而是你的recvfrom死循环了吧!你在调用
shutdown和closesocket后,单步跟踪recvfrom线程看看你是不是没有判断recvfrom返回值而导致死循环
LPR_Pro 2010-02-05
  • 打赏
  • 举报
回复
ding

18,355

社区成员

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

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