问候。我刚刚开始使用boost :: asio库并遇到了一些与boost :: asio :: ip :: tcp :: iostream相关的早期难题。
我的问题分为两部分:
1.。)如何使用简单的主机和端口号连接iostream?
我可以使client和server [boost.org]示例正常编码。服务器明确指定端口:
boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), 13);
tcp::acceptor acceptor(io_service, endpoint);
13号港口是“白天”服务的着名港口。
客户端示例通过指定主机和服务名称进行连接:
tcp::iostream s(argv[1], "daytime");
对于我自己的应用程序,我想将服务器放在任意端口上并按编号连接,如下所示:
服务器:
boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), port);
tcp::acceptor acceptor(io_service, endpoint);
acceptor.accept(*this->socketStream.rdbuf());
...
客户端:
boost::asio::ip::tcp::iostream sockStream;
...
sockStream.connect("localhost", port);
...
如果在客户端中,我尝试直接指定端口号(而不是按名称指定服务),则流无法连接。有没有办法做到这一点?我不清楚连接的参数是什么/应该是什么。
2.。)测试iostream :: connect调用是否成功的首选方法是什么?
该函数返回void,不会抛出任何异常。到目前为止,我设计的唯一方法是测试stream.fail()和/或stream.good()。这是这样做的方式,还是有其他方法。
对这些中的一个或两个的建议将不胜感激。此外,如果我忽略相关的文档和/或示例,那将是很好的。到目前为止,我还没有能够通过阅读图书馆文档或搜索“网络”来回答这些问题。
答案 0 :(得分:3)
我不知道为什么asio不起作用(至少使用Boost 1.35.0),端口号表示为int。但是,您可以将端口号指定为字符串。即。
tcp::iostream s(hostname, "13");
应该有用。
关于错误检测的:
tcp::socket
有一个connect()方法,它接受和端点以及对boost::system::error_code
对象的引用,它会告诉你它是否成功连接。
答案 1 :(得分:0)
即使没有返回错误,stream.error()也包含最新的错误代码。我用了代码
do
{
m_stream.clear();
m_stream.connect(host, port);
}
while(m_stream.error());`
您也可以只检查特定的错误boost :: asio :: error :: connection_refused。