19.2 Boost Asio 同步UDP通信

TCP和UDP是两种常见的Internet协议,TCP是一种可靠的、面向连接的协议,UDP则是不可靠的、无连接的协议。 TCP适合传输数据量大、对数据传输准确性要求高的应用,而UDP适合传输数据量小、传输速度快、对传输可靠性要求低的应用。

ASIO库在实现UDP传输时其大体思路与TCP保持一致,两者唯一的区别是在定义套接字时应使用ip::udp::命名空间,其次在传输数据方面服务端应该采用receive_from函数接收参数,如下是一段简单的UDP传输服务端实现。

#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio;
using namespace boost::system;

int main(int argc, char* argv[])
{
io_service io;
ip::udp::socket sock(io, ip::udp::endpoint(ip::udp::v4(), 6666));

while (1)
{
char buf[1];
ip::udp::endpoint ep;

error_code ec;

// 接收参数
sock.receive_from(buffer(buf), ep, 0, ec);

if (ec && ec != error::message_size)
{
throw system_error(ec);
}

std::cout << "发送到: " << ep.address() << std::endl;
sock.send_to(buffer("hello lyshark"), ep);
}

system("pause");
return 0;
}

接着是客户端的实现,对于UDP客户端通常采用sock.open()函数打开套接字,在打开后可调用sock.send_to向服务端发送数据,同时使用sock.receive_from接收数据包,如下是客户端代码实现。

#include <iostream>
#include <vector>
#include <boost/asio.hpp>

using namespace boost::asio;
using namespace boost::system;

int main(int argc, char* argv[])
{
io_service io;

ip::udp::endpoint send_ep(ip::address::from_string("127.0.0.1"), 6666);
ip::udp::socket sock(io);
sock.open(ip::udp::v4());

char buf[1];

// 发送数据
sock.send_to(buffer(buf), send_ep);

std::vector<char> v(100, 0);
ip::udp::endpoint recv_ep;

// 接收数据
sock.receive_from(buffer(v), recv_ep);
std::cout << "数据来自于: " << recv_ep.address() << std::endl;
std::cout << "数据: " << &v[0] << std::endl;

system("pause");
return 0;
}

读者可自行编译并运行上述代码片段,则可输出如下图所示的效果;