[英]Strange behavior of send in c++ socket connection
我正在嘗試使用c ++下的tcp套接字連接。 我想通過網絡發送std :: map對象的序列化(JSON)形式。 我發現在發送了一定數量的數據包(取決於數據包大小)之后,就無法再發送了。 我已經嘗試了curl lib和用於套接字連接的標准POSIX API:
在通信過程中,使用了相同的套接字連接。我想整個事情都與緩沖區大小有關,但是(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);
}
}
如果對等方未讀取您正在發送的數據,則可能會發生這種情況。
數據包進入另一端的套接字的接收緩沖區,並將ACK發送回給您,因此一些數據被確認並從套接字的發送緩沖區中丟棄。 但是,如果對等方未從其接收緩沖區中提取數據,則它最終會變滿,並且您無法發送任何數據,除非該位置被釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.