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; }
|
读者可自行编译并运行上述代码片段,则可输出如下图所示的效果;