Poco :: Net库挂起在Poco :: Net :: SocketStream的输出上

时间:2013-03-21 05:56:36

标签: c++ networking tcp port poco-libraries

通过POCO website上的幻灯片,我编写了一个与他们的第一个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函数输出一些数据,然后挂起。 我如何获得其余数据?

3 个答案:

答案 0 :(得分:0)

使用Poco :: Net :: DialogSocket。

答案 1 :(得分:0)

似乎答案是在shutdownSend()调用之后立即在套接字上调用flush()

请参阅poco问题2384 https://github.com/pocoproject/poco/issues/2384

因此它将是:

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

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

答案 2 :(得分:-1)

使用我自己的TCP服务器进行测试,我发现如果代码无法连接到远程服务器,则代码会挂起。

如果有正在运行的TCP服务器,在向/从远程服务器发送和接收一些数据之后,如果我关闭远程服务器连接(关闭我的服务器),服务器响应将转到stdout控制台。

您是否尝试通过代理连接谷歌?

另一条线索......来自Poco :: Net :: SocketStream描述:

  

使用来自SocketStream的格式化输入时,请始终确保a   为套接字设置接收超时。否则你的程序可能会   意外地挂了。

尝试在代码中使用try-catch块来测试它是否正在启动一些异常。

祝你好运