Библиотека Poco::Net зависает при выводе Poco::Net::SocketStream

просматривая слайды на веб-сайте POCO, я написал программу, почти идентичную их первому примеру NET.

#include <iostream>
#include <cstdlib>

#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/StreamSocket.h>
#include <Poco/Net/SocketStream.h>
#include <Poco/StreamCopier.h>


int main(int argc, char** argv){

    Poco::Net::SocketAddress socket_address("www.google.com",80);
    Poco::Net::StreamSocket stream_socket(socket_address);
    Poco::Net::SocketStream socket_stream(stream_socket);

    socket_stream << "GET / HTTP/1.1\r\n"
           "Host: www.google.com\r\n"
           "\r\n";
    socket_stream.flush();

    Poco::StreamCopier::copyStream(socket_stream,std::cout);

    return EXIT_SUCCESS;
}

Функция CopyStream выводит часть данных, а потом зависает. Как получить остальные данные?


person Trevor Hickey    schedule 21.03.2013    source источник
comment
Упс, ты прав. Я скомпилировал и запустил пример, и он зависает через две или три секунды: S   -  person Cesar Ortiz    schedule 21.03.2013


Ответы (3)


вместо этого используйте Poco::Net::DialogSocket.

person UVK    schedule 13.08.2014

Кажется, ответ состоит в том, чтобы вызвать shutdownSend() в сокете сразу после вызова flush().

См. проблему poco 2384 https://github.com/pocoproject/poco/issues/2384

Так было бы:

socket_stream.flush(); stream_socket.shutdownSend();

Poco::StreamCopier::copyStream(socket_stream,std::cout);

person R. Corsi    schedule 20.08.2018

Используя свой собственный TCP-сервер для тестирования, я вижу, что ваш код зависает, если он не может подключиться к удаленному серверу.

Если есть работающий TCP-сервер, после отправки и получения некоторых данных на/с удаленного сервера, если я закрываю соединение с удаленным сервером (выключая свой сервер), ответ сервера отправляется на консоль stdout.

Вы пытаетесь подключиться к Google через прокси?

Еще одна подсказка... из описания Poco::Net::SocketStream:

При использовании форматированного ввода из SocketStream всегда проверяйте, что для сокета установлено время ожидания приема. В противном случае ваша программа может неожиданно зависнуть.

Попробуйте использовать блок try-catch с вашим кодом, чтобы проверить, запускает ли он какое-то исключение.

Удачи

person Cesar Ortiz    schedule 21.03.2013