套接字编程更新:recv返回-1,错误= 10053

我正在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()); } 

我现在得到的错误是:

  1. 首先,recv = 0多次,即发送者断开;
  2. 最后,recv返回-1,错误= 10053。

我的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()