UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。
写了一个客户端是C++的程序,服务端是C#的例子。客户端向服务器端发送消息,服务端接收,但不需要回应。
服务端
1 static void Main(string[] args) 2 { 3 int recv; 4 byte[] data = new byte[1024]; 5 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001); 6 //1.创建socket 7 Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 8 //2.绑定ip 9 newsock.Bind(ipep); 10 Console.WriteLine("This is a Server,host name is {0}",Dns.GetHostName()); 11 Console.WriteLine("Waiting for a client...."); 12 //得到客户机IP 13 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 14 EndPoint Remote = (EndPoint)(sender); 15 while (true) 16 { 17 //接受信息 18 recv = newsock.ReceiveFrom(data, ref Remote); 19 String str = Encoding.ASCII.GetString(data, 0, recv); 20 Console.WriteLine(str); 21 } 22 }
1.服务器端通过socket()系统调用建立一个应用程序与udp协议间的通信线路;
2.使用bind()系统调用指定端口号
3.使用receiveFrom()来从客户端接收请求,并且服务器通过recvfrom调用获得客户端的ip与端口号。
客户端
#include <Winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib")//必须
1 void UDPClinet( char *str) 2 { 3 //加载套接字库 4 WORD wVeRsionRequested; 5 WSADATA wsaData; 6 int err; 7 wVeRsionRequested = MAKEWORD( 1, 1 ); 8 err = WSAStartup( wVeRsionRequested, &wsaData ); 9 if ( err != 0 ) { 10 return; 11 } 12 13 if ( LOBYTE( wsaData.wVersion ) != 1 || 14 HIBYTE( wsaData.wVersion ) != 1 ) { 15 WSACleanup( ); 16 return; 17 } 18 //创建套接字 19 SOCKET sockClient= socket(AF_INET, SOCK_DGRAM, 0); 20 //创建地址结构体. 21 SOCKADDR_IN addrSrv; 22 addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1"); 23 addrSrv.sin_family = AF_INET; 24 addrSrv.sin_port = htons(8001); 25 sendto(sockClient, str, strlen(str), 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); 26 27 //关闭套接字. 28 closesocket(sockClient); 29 //关闭套接字库. 30 WSACleanup(); 31 32 }
1.加载套接字库,创建套接字(WSAStartup()/socket());
2.向服务器发出连接请求(connect());
3.和服务器端进行通信(send()/recv());
4.关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。