2013-03-15 398 views
1

我在Windows 7上实现了一个TCP/IP应用程序,它围绕套接字recv()调用进行循环。对于少量数据(< 5 MB)它可以正常工作,但对于大数据(> 20 MB),recv会在两者之间失败。套接字编程更新:recv返回-1,错误= 10053

详细说明:我的应用程序的需要,TCP应用程序正在发送大量的数据,以HTTP服务器与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.

我的TCP/IP的应用程序将数据发送到HTTP服务器。对于小数据同样适用,但问题伴随着大量数据。 HTTP服务器是否超时?

+2

您是否使用WSAGetLastError()来获取错误代码? Windows不使用'errno'。 – 2013-03-15 13:24:11

+0

@roger_rowland好吧,我会检查WSAGetLastError()并尽快更新。 – RDX 2013-03-15 16:54:58

回答

2

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

+0

我现在得到的错误是 首先recv = 0许多次,即发送者断开连接 最后recv返回-1,并且error = 10053 – RDX 2013-03-16 09:06:20

+0

10053是'WSAECONNABORTED'。当'recv()'返回0时,**连接已经不在**,所以停止使用它。调用'closesocket()'来清理资源并继续前进。 – 2013-03-16 15:22:14