我正在 c++ 下试验 tcp 套接字连接。我想通过网络发送 std::map 对象的序列化 (JSON) 形式。我发现在发送了一定数量的数据包(这取决于数据包的大小)之后,就无法再发送了。我已经尝试了用于套接字连接的 curl lib 和标准 POSIX API:
- 在 POSIX API 中发送:在发送约 100 个数据包后开始阻塞
- curl: curl_easy_send 似乎执行了,但是服务器没有收到新的数据包
在通信期间使用相同的套接字连接。我想整个事情与缓冲区大小有关,但是(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);
}
}