Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ recvfrom函数返回-1,没有错误_C++_Network Programming_Udp_Winsock - Fatal编程技术网

C++ recvfrom函数返回-1,没有错误

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

标题几乎说明了一切。我有一个接收线程在等待来自客户端的输入,但是当没有读取任何内容时,它会返回-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_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表示读取的字节数。Invoke
WSAGetLastError()
确定原因。
-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错误事实上,我在访问数据的同时运行了代码,结果它清除了我的缓冲区,因此产生了错误