我正在Windows 7上实现一个围绕套接字recv()调用的TCP / IP应用程序。 对于less量的数据(<5 MB),它工作正常,但对于大数据(> 20 MB),recv之间的失败。
详细信息:我的应用程序需要与运行的HTTP服务器进行通信,两者都运行在同一台机器上,在这个场景中,tcp应用程序正在向HTTP服务器发送大量数据
它给出错误= 2,recv返回0。
错误2意味着ENOENT,但意味着什么? 。 有谁知道这是什么(关于一个sockets),我怎么能解决这个问题?
msgLen = recv(s,msg,BUFFER_SIZE,0); if(msgLen > 0) { // do processing } else { printf("\n no data received .... msgLen=%d",msgLen); printf("\n no data received .... errno=%d",errno); }
根据评论更新代码
msgLen = recv(s,msg,BUFFER_SIZE,0); if(msgLen > 0) { // do processing } else if(msgLen == 0) { printf("\n sender disconnected"); } else { printf("\n no data received .... msgLen=%d",msgLen); printf("\n no data received .... errno=%d",WSAGetLastError()); }
我现在得到的错误是:
我的TCP / IP应用程序正在向HTTP服务器发送数据。 对于小数据也是一样,但是这个问题伴随着大量的数据。 HTTP服务器是否超时?
当recv()
返回0时,表示对方正常断开连接(假设你请求的缓冲区大小不是0)。 recv()
仅在返回SOCKET_ERROR
(-1)时才提供错误代码。 在Windows上,您必须使用WSAGetLastError()
来获取错误代码,而不是errno
,例如:
msgLen = recv(s,msg,BUFFER_SIZE,0); if(msgLen > 0) { // do processing } else if (msgLen == 0) { printf("\n sender disconnected"); } else { printf("\n no data received .... error=%d",WSAGetLastError()); }
另外请记住,如果您使用的是非阻塞套接字,则错误代码可能是WSAEWOULDBLOCK
,这不是一个致命错误。 您可以使用select()
来检测套接字何时有数据,然后再次尝试recv()
。