C++ Boost asio ip tcp iostream错误检测
你好。我刚刚开始使用boost::asio库,并且遇到了一些与boost::asio::ip::tcp::iostream相关的早期困难 我的问题分为两部分: 1.)如何仅使用主机和端口号连接iostream 我可以使和[boost.org]示例按照编码的方式正常工作。服务器显式指定端口:C++ Boost asio ip tcp iostream错误检测,c++,sockets,boost-asio,iostream,C++,Sockets,Boost Asio,Iostream,你好。我刚刚开始使用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_se
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()。是这样做的,还是有其他方法
如能就其中一项或两项提出建议,将不胜感激。另外,如果我忽略了相关的文档和/或示例,那就太好了。到目前为止,我还无法通过阅读库文档或搜索“网络”来回答这些问题。我不知道为什么asio(至少在Boost 1.35.0中)无法使用以int表示的端口号。但是,您可以将端口号指定为字符串。i、 e
tcp::iostream s(hostname, "13");
应该有用
关于错误检测:
tcp::socket
有一个connect()方法,它接受和端点,并引用一个boost::system::error\u code
对象,该对象将告诉您它是否成功连接。即使没有返回错误,stream.error()也包含最新的错误代码。我用了密码
do
{
m_stream.clear();
m_stream.connect(host, port);
}
while(m_stream.error());`
您也只能检查特定的错误boost::asio::error::connection\u被拒绝。谢谢您的帮助。那么,有没有办法将tcp::socket放入tcp::iostream中?@Adam-我不知道。我使用asio已经有一段时间了,我正在查看的代码将套接字直接用于I/O(使用socket::send和socket::read_some),而不是使用iostream@Adam-如果您试图在tcp::iostream上设置boost::asio::socket_基本选项,可以通过rdbuf()->set_option()完成此操作-请参阅