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

时间:2013-03-15 13:10:45

标签: windows sockets networking tcp recv

我正在Windows 7上实现一个TCP / IP应用程序,它绕过socket recv()调用。对于少量数据(<5 MB),它工作正常,但对于大数据(> 20 MB),recv在两者之间失败。

详细信息:我的应用需要与运行的HTTP服务器进行通信,两者都在同一台机器上运行,在此场景中,tcp app正在向HTTP服务器发送大量数据

它给出错误= 2,recv返回0。

错误2表示ENOENT,但这意味着什么?。有谁知道这是什么(关于套接字)以及我如何解决这个问题?

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。
  3. 我的TCP / IP应用程序正在向HTTP Server发送数据。这同样适用于小数据,但问题在于大量数据。 HTTP服务器是否超时?

1 个答案:

答案 0 :(得分:2)

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