我正在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());
}
我现在得到的错误是:
我的TCP / IP应用程序正在向HTTP Server发送数据。这同样适用于小数据,但问题在于大量数据。 HTTP服务器是否超时?
答案 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()
。