recvfrom 返回值为0的问题

xue23 2005-08-08 05:07:35
recvfrom返回值为0有两种情况。
1.socket已经"温和"关闭(使用shutdown或者设置linear属性)
2.对方发送一个空数据,也就是对方发送的数据长度为0。这时socket也就可以接收到的,并且recvfrom返回值为0。

现在如何区分这种情况呢?
...全文
2047 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
newbiestar 2005-08-10
  • 打赏
  • 举报
回复
靠,都忘了这个是讨论什么的了……udp对方关闭没影响,不是tcp的……
newbiestar 2005-08-10
  • 打赏
  • 举报
回复
对方关闭socket也算关闭吧?对方当然知道,只不过你不知道而已……
softrain 2005-08-10
  • 打赏
  • 举报
回复
SOCKET是否关闭你自己还不知道吗?还需要发数据报来测试?
如果没有关闭,你发了空数据报,对方是不是也要发空数据报来测试是否已经关闭?这样就无限循环下去了。
xue23 2005-08-10
  • 打赏
  • 举报
回复
1。即使是我不发送0长度的数据,也会有其他人发送
2。当socket graceful关闭,recvfrom接收时也会返回0。

我想了一下,这样解决,可能有效。
如果recvfrom返回为0,我向对方发送一个长度不为0的数据,如果sendto返回值大于0,则此socket正常,否则说明socket已经关闭了。
xue23 2005-08-10
  • 打赏
  • 举报
回复
UDP实际是有连结的概念的,QQ的登录方式之一就是用UDP,你不能说此时QQ没有服务器连接。因为有时收到0长度的信息是有特别包含的,所以要作处理,简单的过滤掉是很低级的作法。
everandforever 2005-08-10
  • 打赏
  • 举报
回复
recvfrom 是针对UDP的。UDP下没有建立连接的概念,那么对方即使SHUTDOWN又怎么会通知你呢?既然是非连接的,为什么要把收到0字节拿出来特别处理呢?就直接过滤掉好了。
newbiestar 2005-08-09
  • 打赏
  • 举报
回复
填充不发生在tcp/ip协议这一块,到了对方那里会被以太网的协议栈剥离这些填充的内容的……
softrain 2005-08-09
  • 打赏
  • 举报
回复
在你的软件中不允许发送0字节的数据不就OK了。毕竟发送4字节和发送0字节数据都达不到以太侦的最小长度,系统都会在末尾补充字节的。
teli_eurydice 2005-08-09
  • 打赏
  • 举报
回复
up
softrain 2005-08-09
  • 打赏
  • 举报
回复
填充的数据长度会加上UDP头的长度写到UDP的头中的。以太侦自己填充的长度不会加到UDP的头中。
crystal_heart 2005-08-08
  • 打赏
  • 举报
回复
A发送0byte,B收到之后,发送0byte回去给A。
然后A再收到0byte,B收到之后,然后再次给A发送0byte。
以下从略
newbiestar 2005-08-08
  • 打赏
  • 举报
回复
你sendto一下,记得发送0个字节,然后检查返回值,如果是0,那么socket没有关闭,如果是SOCKET_ERROR的话,用WSAGetLastError看看什么错误,如果是WSAESHUTDOWN那么就说明关闭了

18,356

社区成员

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

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