C++ recvfrom函数返回-1,没有错误
标题几乎说明了一切。我有一个接收线程在等待来自客户端的输入,但是当没有读取任何内容时,它会返回-1,而不是返回0字节读取,但不会返回任何错误 有什么提示可以解释为什么这个函数会这样做 谢谢 编辑: 这是接收代码C++ recvfrom函数返回-1,没有错误,c++,network-programming,udp,winsock,C++,Network Programming,Udp,Winsock,标题几乎说明了一切。我有一个接收线程在等待来自客户端的输入,但是当没有读取任何内容时,它会返回-1,而不是返回0字节读取,但不会返回任何错误 有什么提示可以解释为什么这个函数会这样做 谢谢 编辑: 这是接收代码 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_s
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,\u error
为0。您可以尝试的另一件事是使用SO\u error
调用,以检查特定于套接字的错误(相对于任何线程套接字上的最后一个错误)。您可以尝试的另一件事是使用SO\u error
调用以检查特定于套接字的错误(与任何线程套接字上的最后一个错误相比)。WSAGetLastError()
当recvfrom()
返回SOCKET\u error
时,不应返回0。这表明您可能正在两次调用之间执行某种操作,在读取WinSock的错误代码之前间接清除它
另一方面,在调用recvfrom()
之前,您不需要在中填写sockaddr\u。它会在中为您填写有关发件人的信息。任何信息recvfrom()
需要执行的是作业是从套接字
句柄获取的。WSAGetLastError()
在recvfrom()时不应返回0
返回SOCKET\u ERROR
。这表明您可能在两次调用之间做了一些事情,在读取WinSock的错误代码之前间接清除了它
另一方面,在调用recvfrom()
之前,您不需要在中填写sockaddr\u。它会在中为您填写有关发件人的信息。任何信息recvfrom()
需要执行的是从套接字
句柄获取的作业。如何确定没有返回错误?WSAGetLastError
在这种情况下是您的朋友。值为0表示连接已关闭。任何值>0表示读取的字节数。InvokeWSAGetLastError()
确定原因。-1
是发生故障时从recvfrom()
返回的SOCKET\u ERROR
的值。使用WSAGetLastError()
确定失败的原因。您直接使用WinSock而不是Boost.Asio的任何原因?我使用WinSock是因为公司的要求。您如何确定没有返回错误?WSAGetLastError
在这种情况下是您的朋友。值为0表示连接已关闭。任何值>0都是错误读取的字节数。调用WSAGetLastError()
以确定原因。-1
是发生故障时从recvfrom()
返回的SOCKET\u ERROR
的值。使用WSAGetLastError()
以确定失败的原因。您直接使用WinSock而不是Boost.Asio的任何原因?我使用WinSock是因为公司的要求可能套接字句柄无效?可能套接字句柄无效?事实上,我在访问数据的同时运行了代码,结果它清除了我的缓冲区,因此giving错误事实上,我在访问数据的同时运行了代码,结果它清除了我的缓冲区,因此产生了错误