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

  • 相关阅读:
    LuoGu P1006 传纸条
    LuoGu P1083 借教室
    动态规划-区间dp-Palindrome Removal
    咕果
    直径问题 Diameter Problems
    Contest 161
    ALBert
    Focal Loss
    Contest 159
    Contest 160
  • 原文地址:https://www.cnblogs.com/kire/p/4428941.html
Copyright © 2020-2023  润新知