gpt4 book ai didi

sockets - recv()返回0

转载 作者:行者123 更新时间:2023-12-04 13:42:20 29 4
gpt4 key购买 nike

我有一个非常烦人的问题,我在其他论坛上发现了几次,但是找不到合适的解决方案。
问题是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/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com