2009-06-24 111 views
1

问候。我刚刚开始使用boost :: asio库,并遇到了与boost :: asio :: ip :: tcp :: iostream相关的一些早期难题。升压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()。这是做到这一点的方式,还是有其他一些方法。


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

回答

3

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

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

应该工作。关于

错误检测:

tcp::socket有connect()方法这需要和端点和一个boost::system::error_code对象,它会告诉你,如果它成功地连接一个参考。

+0

感谢您的帮助。那么有没有办法使用tcp :: socket并将其放入tcp :: iostream中? – 2009-06-24 20:04:45

0

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

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

你也可以只检查特定错误的boost ::支持ASIO ::错误:: connection_refused。