提升asio ip tcp iostream错误检测

时间:2009-06-24 19:08:18

标签: c++ sockets boost-asio iostream

问候。我刚刚开始使用boost :: asio库并遇到了一些与boost :: asio :: ip :: tcp :: iostream相关的早期难题。

我的问题分为两部分:

1.。)如何使用简单的主机和端口号连接iostream?

我可以使clientserver [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()。这是这样做的方式,还是有其他方法。


对这些中的一个或两个的建议将不胜感激。此外,如果我忽略相关的文档和/或示例,那将是很好的。到目前为止,我还没有能够通过阅读图书馆文档或搜索“网络”来回答这些问题。

2 个答案:

答案 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。