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

Poco::Net library hangs on output of Poco::Net::SocketStream

本文关键字:Poco Net 输出 挂起 SocketStream      更新时间:2023-10-16

根据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.1rn"
           "Host: www.google.comrn"
           "rn";
    socket_stream.flush();
    Poco::StreamCopier::copyStream(socket_stream,std::cout);
    return EXIT_SUCCESS;
}
CopyStream函数输出一些数据,然后挂起。我如何得到剩下的数据?

使用Poco::Net::DialogSocket代替。

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

参见poco issue 2384https://github.com/pocoproject/poco/issues/2384

所以应该是:

socket_stream.flush ();

stream_socket.shutdownSend ();

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

使用我自己的TCP服务器进行测试,我看到您的代码挂起,如果它不能连接到远程服务器。

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

您正在尝试通过代理连接到谷歌吗?

另一条线索……from Poco::Net::SocketStream description:

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

尝试在你的代码中使用Try -catch块来测试它是否启动了一些异常。

好运