1

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

我的问题有两个部分:

1.) 如何仅使用主机和端口号连接 iostream?

我可以使客户端服务器[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()。这是这样做的方法,还是有其他方法。


对其中一项或两项的建议将不胜感激。另外,如果我忽略了相关的文档和/或示例,那就太好了。到目前为止,我还无法通过阅读图书馆文档或搜索“网络”来回答这些问题。

4

2 回答 2

3

我不知道为什么 asio 不起作用(至少对于 Boost 1.35.0),端口号表示为 int。但是,您可以将端口号指定为字符串。IE

tcp::iostream s(hostname, "13");

应该管用。

关于错误检测:

tcp::socket有一个 connect() 方法,它采用端点和一个boost::system::error_code对象的引用,它会告诉你它是否连接成功。

于 2009-06-24T19:54:35.130 回答
0

即使没有返回错误,stream.error() 也包含最新的错误代码。我使用了代码

do
{
    m_stream.clear();
    m_stream.connect(host, port);
}
while(m_stream.error());`

您也可以只检查特定的错误 boost::asio::error::connection_refused。

于 2013-05-07T17:17:23.343 回答