2013-02-01 80 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

我刚刚复制了接收器使用的代码。 –