boost asio 库中通过socket获得远端的endpoint的参数(ip, port)

本文介绍了如何使用C++标准库中的方法来获取客户端的IP地址及端口号。通过socket远程端点的方法可以轻松实现这一功能。
IP:
std::string sClientIp = socket().remote_endpoint().address().to_string();

port:
unsigned short uiClientPort = socket().remote_endpoint().port();


在使用boost asio进行UDP编程时,可从同步和异步两方面来操作,以下是详细介绍: ### 同步编程 #### 服务器端 ```cpp #include<iostream> #include"boost/asio.hpp" #include"boost/bind.hpp" using namespace std; using namespace boost; using asio::ip::udp; int main() { cout << "server start &hellip;&hellip;" << endl; asio::io_context io; udp::socket sock(io, udp::endpoint(udp::v4(), 6688)); char buf[0xFF]; udp::endpoint cliPoint; while (1) { sock.receive_from(asio::buffer(buf), cliPoint); sock.send_to(asio::buffer(buf),cliPoint); } } ``` 此代码实现了一个简单的UDP同步服务器,其功能是接收客户端消息并原样返回给客户端。它在本地的6688端口上监听UDP消息,通过`receive_from`接收客户端消息,再用`send_to`将消息发回客户端 [^2]。 #### 客户端 ```cpp #include <boost/asio.hpp> #include <boost/asio/ip/udp.hpp> #include <exception> #include <print> using boost::asio::ip::udp; int main(int argc, char* argv[]) { if (argc != 2) { std::println("Error usage!"); return -1; } try { boost::asio::io_context io_context; udp::resolver solver(io_context); auto receiver_endpoint = *solver.resolve(udp::v4(), argv[1], "daytime").begin(); udp::socket socket(io_context); socket.open(udp::v4()); std::array<char, 1> send_buf = { { 0 } }; socket.send_to(boost::asio::buffer(send_buf), receiver_endpoint); std::array<char, 128> recv_buf; udp::endpoint sender_endpoint; socket.receive_from( boost::asio::buffer(recv_buf), sender_endpoint); std::println("receive: {}", recv_buf.data()); } catch (const std::exception& e) { std::println("Exception occurs: {}", e.what()); } } ``` 该代码为一个简单的UDP同步客户端,它接收一个命令行参数作为服务器地址,向服务器发送一个字节的数据,并接收服务器的响应。使用`resolver`解析服务器地址,通过`send_to`发送数据,`receive_from`接收数据 [^3]。 ### 异步编程 #### 服务器端 ```cpp #include <iostream> #include <cstdlib> #include <boost/asio.hpp> using boost::asio::ip::udp; enum { max_length = 1024}; void server(boost::asio::io_context &io_context, unsigned short port){ udp::socket sock(io_context, udp::endpoint(udp::v4(), port)); for(;;){ char data[max_length]; udp::endpoint sender_endpoint; size_t length = sock.receive_from(boost::asio::buffer(data, max_length), sender_endpoint); sock.send_to(boost::asio::buffer(data,length), sender_endpoint); } } int main(int argc , char ** argv) { try{ if(argc != 2){ std::cerr <<"Usage: server <port> "; return 1; } boost::asio::io_context io_context; server(io_context, std::atoi(argv[1])); } catch(std::exception &e){ std::cerr << "Exception:" << e.what() << " "; } return 0; } ``` 这是一个异步服务器的示例,它接收一个命令行参数作为监听端口,在指定端口上监听UDP消息,接收客户端消息并原样返回 [^4]。 #### 异步接收示例 ```cpp void gvstream::CaptureMultiPartFrame() { m_receiver_socket.async_receive_from( boost::asio::buffer(m_message.data(), m_message.size()), m_tramitter_endpoint, boost::bind(&gvstream::HandleMultipartMessage, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred) ); } void gvstream::HandleMultipartMessage(const boost::system::error_code& err, size_t bytesTransferred) { char* multiPartPacket = new char[m_packet_size]; memcpy(multiPartPacket, m_message.data(), bytesTransferred); uint64_t blockId = ProcessPacket(multiPartPacket, bytesTransferred); CheckFrameCompletion(blockId); CaptureMultiPartFrame(); } ``` 此代码展示了如何使用异步方式接收UDP消息。`CaptureMultiPartFrame`函数发起异步接收操作,当有消息到达时,`HandleMultipartMessage`函数会被调用进行消息处理,处理完成后再次发起异步接收 [^5]。 ### 相关资料 - 可以参考weifengdq在github上的项目`learn_non_boost_asio`,其中涉及了non - Boost Asio的UDP等相关内容,虽不是直接关于boost asio,但对理解UDP编程有一定帮助 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值