2013-03-15 392 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