2013-02-01 85 views
0

我正在試驗C++下的tcp套接字連接。我想通過網絡發送一個std :: map對象的序列化(JSON)形式。我發現在發送了一定數量的數據包之後(這取決於數據包的大小),發送已經不可能了。我曾經嘗試都捲曲lib和套接字連接標準的POSIX API:在c + +套接字連接發送的奇怪行爲

  • 發送的POSIX API:它開始阻塞後〜100包已被送往
  • 捲曲:curl_easy_send似乎執行,但服務器不接收新的數據包

在通信同一個套接字連接是used.I猜測整個事情是關係到緩衝區大小,但(1)我增加了它,並沒有看到任何顯著效果(2)如果緩衝區當前已滿,我希望在給定的時間後可以再次發送。也許我在這種情況下錯過了一些重要但愚蠢的選項或信息。所以我的問題是:是服務器的配置錯誤還是我沒有以正確的方式使用API​​?

接收側:

ListenerThread::ListenerThread() { 
    curl = curl_easy_init(); 

    if (curl != 0) { 
     curl_easy_setopt(curl, CURLOPT_URL, "..."); 
     curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L); 
     res = curl_easy_perform(curl); 
     res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockfd); 

     if (res != 0) { 
      printf("Error: %s\n", curl_easy_strerror(res)); 
     } 
    } 
} 
... 
void ListenerThread::run() { 
    while (true) { 
     char buf[2048]; 

     wait_on_socket(sockfd, 1, 60000L); 
     res = curl_easy_recv(curl, buf, 2048, &iolen); 

     if (CURLE_OK != res) { 
      break; 
     } 

     nread = (curl_off_t) iolen; 

     printf("Received %" CURL_FORMAT_CURL_OFF_T " bytes.\n", nread); 
     printf("Buffer: %s\n", buf); 
    } 
} 
+0

它被接收了嗎? –

+0

直到發送工作正常,接收到所有數據包。 –

+0

嘗試在服務器和客戶端程序上使用'strace',您將看到正在發生的讀/寫/發送/接收系統調用。您還會看到,您被阻止的位置(以及可能原因)。 –

回答

1

如果對方不讀書你要發送的數據它可能發生。

數據包進入另一端套接字的接收緩衝區,並將ACK發送回給您,因此一些數據得到確認並從套接字發送緩衝區中丟棄。但是,如果對等方沒有從其接收緩衝區中提取數據,它最終會變滿,並且只有在某處被釋放後才能發送任何數據。

+0

我剛剛複製了接收器使用的代碼。 –