1. 程式人生 > >105.UDP通信實現廣播

105.UDP通信實現廣播

pri recvfrom 指針 use rtu 記錄 inet_addr 參數 body

  • 客戶端
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <winsock.h>
     4 #pragma comment(lib,"ws2_32.lib")
     5 
     6 void main()
     7 {
     8     //存放版本
     9     WORD wversion;
    10     //指針,存放網絡執行信息
    11     WSADATA wsadata;
    12     //管理錯誤,標號
    13     int err;
    14 
    15     //客戶端套接字,用於連接
    16     SOCKET sockclient;
    
    17 //服務器地址 18 SOCKADDR_IN addrserver; 19 //客戶端地址 20 SOCKADDR_IN addrclienet; 21 22 //長度 23 int length = 0; 24 //接收 25 char recvstr[256] = { 0 }; 26 //標示 27 BOOL bflags=1; 28 //設定版本 29 wversion = MAKEWORD(2, 2); 30 err = WSAStartup(wversion, &wsadata); 31 if
    (err!=0) 32 { 33 printf("獲取版本失敗"); 34 return; 35 } 36 37 if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion)!=2) 38 { 39 printf("版本對比失敗,不一致"); 40 return; 41 } 42 //UDP報文傳輸 43 sockclient = socket(AF_INET, SOCK_DGRAM, 0); 44 //setsockopt()函數,用於任意類型、任意狀態套接口的設置選項值。
    45 //盡管在不同協議層上存在選項,但本函數僅定義了最高的“套接口”層次上的選項。 46 //多播必須指定的參數 47 //flags設定,1代表廣播,0禁止廣播 48 setsockopt(sockclient, SOL_SOCKET, SO_REUSEADDR, &bflags, sizeof(bflags)); 49 50 //存放客戶端ip地址 51 addrclienet.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 52 addrclienet.sin_family = AF_INET; 53 addrclienet.sin_port = htons(9999);//端口 54 //客戶端套接字與客戶端信息綁定 55 bind(sockclient, (SOCKADDR*)&addrclienet, sizeof(SOCKADDR)); 56 //等於地址長度 57 length = sizeof(SOCKADDR); 58 while (1) 59 { 60 printf("wait-----------------\n"); 61 //從客戶端接收消息,地址信息存放在addrserver中 62 recvfrom(sockclient, recvstr, 256, 0, (SOCKADDR*)&addrserver, &length); 63 if (WSAGetLastError()!=0) 64 { 65 puts("收取失敗"); 66 } 67 //哪個服務器發送的 68 printf("%s speak %s\n", inet_ntoa(addrserver.sin_addr), recvstr); 69 } 70 closesocket(sockclient); 71 WSACleanup(); 72 system("pause"); 73 }

  • 服務器端
     1 #define  _CRT_SECURE_NO_WARNINGS
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <winsock.h>
     5 #pragma comment(lib,"ws2_32.lib")
     6 
     7 void main()
     8 {
     9     WORD wversion;//存放版本
    10     WSADATA wsadata;//指針,存放網絡執行信息
    11     int err;//管理錯誤,標號
    12 
    13     SOCKET socksever;//服務器套接字
    14     //記錄服務器信息
    15     SOCKADDR_IN  addrserver;
    16     //記錄客戶端信息
    17     SOCKADDR_IN  addrclienet;
    18 
    19     int length = 0;
    20     char sendstr[256] = { 0 };
    21     BOOL bflags = 1;//標示
    22     wversion = MAKEWORD(2, 2);//設定版本
    23     err = WSAStartup(wversion, &wsadata);
    24     if (err != 0)
    25     {
    26         printf("獲取版本失敗");
    27         return;
    28     }
    29 
    30     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
    31     {
    32         printf("版本對比失敗,不一致");
    33         return;
    34     }
    35 
    36     socksever = socket(AF_INET, SOCK_DGRAM, 0);//報文
    37     // SO_BROADCAST多播必須指定的參數
    38     //flags設定,1代表廣播,0禁止廣播
    39     setsockopt(socksever, SOL_SOCKET, SO_BROADCAST, &bflags, sizeof(bflags));//綁定
    40 
    41     addrserver.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//任意主機
    42     addrserver.sin_family = AF_INET;
    43     addrserver.sin_port = htons(7888);//端口
    44 
    45     //服務器信息與套接字綁定
    46     bind(socksever, (SOCKADDR*)&addrserver, sizeof(SOCKADDR));//綁定
    47 
    48     //填寫廣播,255.255.255.255,廣播
    49     addrclienet.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
    50     addrclienet.sin_family = AF_INET;
    51     addrclienet.sin_port = htons(9999);//端口
    52 
    53     length = sizeof(SOCKADDR);//保存地址長度
    54 
    55     while (1)
    56     {
    57         memset(sendstr, 0, 256);
    58         scanf("%s", sendstr);//獲取讀取
    59         //發送消息到客戶端(廣播)
    60         sendto(socksever, sendstr, strlen(sendstr), 0, (SOCKADDR*)&addrclienet, length);
    61     }
    62     closesocket(socksever);
    63     WSACleanup();
    64     system("pause");
    65 }

105.UDP通信實現廣播