1

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

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

它给出 error = 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多次,即sender断开;
  2. 最后,recv 返回 -1,error = 10053。

我的 TCP/IP 应用程序正在向 HTTP 服务器发送数据。同样适用于小数据,但问题来自大量数据。HTTP 服务器超时了吗?

4

1 回答 1

2

返回 0时recv(),表示对方正常断开连接(假设您请求的缓冲区大小不为 0)。 仅在返回(-1)recv()时提供错误代码。SOCKET_ERROR在 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()再次尝试。

于 2013-03-15T16:00:53.227 回答