前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows UDP socket错误码10054,一定要记得处理

Windows UDP socket错误码10054,一定要记得处理

作者头像
gaigai
发布2019-11-07 15:25:57
3.9K0
发布2019-11-07 15:25:57
举报
文章被收录于专栏:Windows开发Windows开发

系统学习Windows客户端开发

A使用UDP socket,调用sendto()函数向B发送数据,但是B没有接收数据发送端口不可达的ICMP报文,之后A调用recvfrom()试图接收目标地址B的数据,recvfrom会返回-1,WSAGetLastError()返回WSAECONNRESET (10054) 连接被对方重置。

奇怪,UDP是无连接,怎么会被对方重置连接呢?

微软官网这么说:If sending a datagram using the sendto function results in an "ICMP port unreachable" response and the select function is set for readfds, the program returns 1 and the subsequent call to the recvfrom function does not work with a WSAECONNRESET (10054) error response. In Microsoft Windows NT 4.0, this situation causes the select function to block or time out.

也就是说,Windows UDP socket将ICMP端口不可达报文的错误,转成WSAECONNRESET 错误码,在recvfrom()时返回。经测试,每次recvfrom()都会这样,所以重试没用只能重新创建socket。

这个问题解决方法是设置socket的工作模式,让底层socket忽略这个错误无需上报。

代码语言:javascript
复制
BOOL bEnalbeConnRestError = FALSE;
DWORD dwBytesReturned = 0;
WSAIoctl(iSock, SIO_UDP_CONNRESET, &bEnalbeConnRestError, sizeof(bEnalbeConnRestError), \
         NULL, 0, &dwBytesReturned, NULL, NULL);

使用UDP时,切记要加上这段代码,要不然在某些异常场景就会出现UDP socket无法正常工作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档