前面创建了一个UDP服务器,主要是提供时间查询,因为它是一个服务器,所以没有能力连接服务器的,因此需要创建一个客户端来,后面主要就是做这件事情。在说明怎么样编写UDP客户端之前,在这里回复一个网友的问题,他说TCP基本上已经可以无错地做任何事情,包括我前面说的视频通讯,因而使用UDP是不必要学习的。在这点上,UDP还是有不可替换的领域,比如要开发局部网的广播,在TCP里是一对一的连接,它是干不了这件事情的。在工业一些应用里,在局部网里有很多设备是通过网络通讯的,但需要快速地搜索到这些设备是否在线,就可以使用UDP来广播一下,就立即知道那些设备在线了。由于使用了boost库,下面创建UDP的代码是非常简单的,代码如下:
// boost_027.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <ctime> #include <boost/asio/ip/tcp.hpp> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/shared_ptr.hpp> #include <boost/array.hpp> #include <iostream> #include <string> //使用UDP命名空间 using boost::asio::ip::udp; // //创建一个UDP的客户端。 //软件开发人员: 蔡军生 2013-08-24 //QQ: 9073204 // void TestUdpClient(void) { //定义一个IO服务对象。 boost::asio::io_service io_service; //IP地址解释器 udp::resolver resolver(io_service); //查询连接的IP域名和端口 udp::resolver::query query(udp::v4(), "127.0.0.1", "daytime"); udp::endpoint receiver_endpoint = *resolver.resolve(query); //创建一个UDP的SOCKET udp::socket socket(io_service); //使用UDP的协议打开服务。 socket.open(udp::v4()); //发送消息给服务器,send_buf是发送的内容,receiver_endpoint是接收的服务器地址。 boost::array<char, 1> send_buf = { 0 }; socket.send_to(boost::asio::buffer(send_buf), receiver_endpoint); //准备接收服务器返回来的数据。 boost::array<char, 128> recv_buf; udp::endpoint sender_endpoint; size_t len = socket.receive_from( boost::asio::buffer(recv_buf), sender_endpoint); //输出接收到服务器的数据。 std::cout.write(recv_buf.data(), len); } int _tmain(int argc, _TCHAR* argv[]) { TestUdpClient(); system("PAUSE"); return 0; }