使用boost asio指定ip和port创建一个iostream

And*_*dry 6 c++ iostream client-server boost-asio

我有一个关于boost asio库的问题.我成功地尝试在客户端和服务器之间创建套接字,这涉及创建解析器以指定服务器的ip和端口(服务器只需要端口)和其他对象,但是,最重要的是,有必要使用write以及read_some作为从套接字读取和写入的函数.我真的很感激使用一个流,这在boost asio中是可能的,但这很奇怪......在几乎所有使用流的例子中,创建服务器都需要提供端口,好吧,让我们来谈谈客户端..客户端,有必要使用iostream构造函数来指定连接流的坐标,这里是代码:

tcp::iostream() s(argv[1], "daytime");
Run Code Online (Sandbox Code Playgroud)

好吧,我真的不明白第一个参数传递了什么,真的不知道白天可能代表什么...基本上,在这里,我告诉:"嘿流,你必须连接到这个服务器.. ."但是如何指定该服务器的IP和端口?请注意,相反,服务器端的一切都很清晰:

boost::asio::io_service io_s;
tcp::acceptor acc(io_s, tcp::endpoint(tcp::v4(), 1950));
for (;;) {
   tcp::iostream stream;
   acc.accept(*stream.rdbuf());
   stream << "Message" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

使用这个模型,我想使用

stream << mymessage_to_send << std::endl;
stream >> a_string_containing_my_message;
Run Code Online (Sandbox Code Playgroud)

为了发送和接收.我怎样才能做到这一点?非常感谢你.

Aru*_*nas 18

您引用的增强asio示例代码:

tcp::iostream s(argv[1], "daytime");
Run Code Online (Sandbox Code Playgroud)

使用"daytime"作为服务表的查找(通常在linux系统上的/ etc/services中),这将识别日间服务的端口是13.

如果要连接到不是众所周知的服务之一的端口,可以使用以下方法:

tcp::iostream s("localhost", "57002"); 
Run Code Online (Sandbox Code Playgroud)

请注意,端口号作为字符串提供,而不是作为无人符号的短整数提供,因为可能会尝试尝试.

当然,"localhost"可以替换为IP地址"127.0.0.1"

  • 这应该是选定的答案. (6认同)

Dan*_*röm 1

我使用Boost.Asio编写了一个客户端/服务器系统。源代码可在GitHub上找到:Client.cppServer.cpp将Boost.Serialization与 Boost.Asio 一起使用允许我通过网络发送任意数据结构。我必须说这是相当令人印象深刻的!