UDP通信

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())

原文地址:https://www.cnblogs.com/kire/p/4428941.html