Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost asio ip tcp iostream错误检测_C++_Sockets_Boost Asio_Iostream - Fatal编程技术网

C++ Boost asio ip tcp iostream错误检测

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库,并且遇到了一些与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()。是这样做的,还是有其他方法



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

我不知道为什么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()完成此操作-请参阅