【问题标题】:recvfrom function returns -1 with no errorrecvfrom 函数返回 -1 且没有错误
【发布时间】:2012-05-16 15:13:57
【问题描述】:

标题几乎说明了一切。我有一个接收线程等待来自客户端的输入,但是当没有读取任何内容时,它没有返回读取的 0 字节,而是返回 -1,但没有返回任何错误。

有什么提示可以解释为什么这个函数会这样吗?

谢谢

编辑:

这是接收代码

sockaddr_in remote;
remote.sin_family = AF_UNSPEC;
remote.sin_addr.s_addr = inet_addr( _host.c_str() );
remote.sin_port = htons( atoi( _port.c_str() ) );
int remoteSize = sizeof(remote);

bytesRead = recvfrom(_os.socket, 
    (char*)buffer, 
    bufferSize, 
    0,(SOCKADDR*)&remote, &remoteSize);

_error = WSAGetLastError();

当我执行时,bytesRead 为 -1,_error 为 0。

【问题讨论】:

  • 你如何确定没有返回错误?
  • WSAGetLastError 在这种情况下是你的朋友。值为 0 表示连接已关闭。任何 > 0 的值都是读取的字节数。调用WSAGetLastError() 来确定原因。
  • -1是SOCKET_ERROR的值,当失败时从recvfrom()返回。使用WSAGetLastError() 确定失败的原因。
  • 有什么理由直接使用 WinSock 而不是 Boost.Asio?
  • 由于公司要求,我正在使用 WinSock

标签: c++ network-programming udp winsock


【解决方案1】:

recvfrom() 返回 SOCKET_ERROR 时,WSAGetLastError() 不应返回 0。这表明您可能在两次调用之间做了一些事情,在您阅读之前间接清除了 WinSock 的错误代码。

附带说明,您无需在拨打recvfrom() 之前填写sockaddr_in。它会为您填写sockaddr_in,其中包含有关发件人的信息。 recvfrom() 需要执行的任何信息都是从 SOCKET 句柄获取的作业。

【讨论】:

  • 事实上,我同时运行了正在访问数据的代码,结果它清除了我的缓冲区,因此出现了错误
【解决方案2】:

您可以尝试的另一件事是使用SO_ERROR 调用getsockopt() 来检查特定于套接字的 错误(与任何线程的套接字上的最后一个错误相比)。

【讨论】:

  • 可能套接字句柄无效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多