sockets - recv()返回0

标签 sockets shutdown zero recv closesocket

我有一个非常烦人的问题,我在其他论坛上发现了几次,但是找不到合适的解决方案。
问题是recv()在连接的最后几个字节上返回0。以下是一些背景信息。

  • 两种(客户端/服务器)应用程序都在同一台计算机上运行。
  • (客户端/服务器)套接字都是非阻塞的
  • 传输的数据大小为53个字节。
  • (客户端/服务器)在执行最后一个send()/recv()时都调用shutdown和closesocket。
  • 我也尝试了SO_LINGER和10秒,
  • 都没有成功

    我多次调用send()(小块),并从客户端传输了53个字节。
    服务器多次调用recv()(4个字节的请求)并读取49个字节,然后返回0(54个字节-49个字节,因此缺少4个字节)。

    MSDN和一些论坛写了非阻塞套接字:
  • recv()绝对在错误上返回<0,并且设置了errno/WSAGetLastError
  • 当另一端关闭连接时,
  • recv()绝对返回= 0
    读取数据时
  • recv()绝对返回> 0

  • MSDN还说:

    Using the closesocket or shutdown functions with SD_SEND or SD_BOTH results in a RELEASE signal being sent out on the control channel. Due to ATM's use of separate signal and data channels, it is possible that a RELEASE signal could reach the remote end before the last of the data reaches its destination, resulting in a loss of that data. One possible solutions is programming a sufficient delay between the last data sent and the closesocket or shutdown function calls for an ATM socket.



    在recv()和send()的示例中考虑了这一点:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

    但是仍然没有成功,在收到49字节后,我仍然会在所有连接的10%中遇到一些中断,其中90%的连接成功。有任何想法吗?谢谢。

    最佳答案

    仅当您请求一个0字节的缓冲区或另一个对等方已正常断开连接时,recv()才返回0。如果您没有收到期望的所有数据,则说明开始时您没有正确读取数据。请使用您的实际代码更新您的问题。

    关于sockets - recv()返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10526382/

    相关文章:

    python - 如何删除包含零的 numpy 数组中的一行?

    ethernet - 如何在 Banana PI ZERO M2 上启用 eth0

    c - 多客户端套接字编程僵尸进程

    c - shutdown() 和 close() 什么都不做

    mongodb - 如何优雅地关闭在 docker 中运行的 monogodb 0.8

    java - 关闭特定数据库并关闭连接的正确方法是什么?

    php array_search 0 索引

    multithreading - 在 Tomcat 中用打开的套接字杀死线程

    python - 为什么 recv 在接收到所有数据之前不阻塞?

    sockets - Haxe:连接到远程主机