Зачем блокирующему сокету повторно возвращать данные нулевой длины? - PullRequest
0 голосов
/ 14 ноября 2009

У меня значительная проблема с использованием стандартного сокета в стиле BSD в программе на C ++. В приведенном ниже коде я подключаюсь к локальному веб-серверу, отправляю запрос и просто создаю цикл, ожидающий возвращения данных. Я на самом деле делаю получение данных, но затем я получаю бесконечный поток данных 0-длины, как если бы это был неблокирующий сокет. Предположительно, веб-сервер не прерывал соединение, потому что в этом случае я бы получил длину -1.

Пожалуйста, игнорируйте простые опечатки, которые я делаю ниже, так как я пишу код из памяти, а не прямое копирование / вставку. Код дает одинаковый результат в OSX и Windows.

int sock = socket(AF_INET, SOCK_STREAM, 0);

//assume serv_addr has been created correctly
connect(sock, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0);

std::string header = "GET / HTTP/1.1\r\n"
    "Host: 127.0.0.1:80\r\n"
    "Keep-Alive: 300\r\n"
    "Connection: keep-alive\r\n\r\n";

send(sock, header.c_str(), header.length()+1, 0);

for (;;) {
    char buffer[1024];
    int len = recv(sock, buffer, 1024, 0);
    cout << len << endl;
    //this outputs two numbers around 200 and 500,
    //which are the header and html, and then it
    //outputs and endless stream of 0's
}

1 Ответ

6 голосов
/ 14 ноября 2009

со справочной страницы recv

For TCP sockets, the return value 0 means the peer has closed its half
     side of the connection.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...