105.UDP通信实现广播

  • 客户端
     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-----------------
    ");
    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
    ", 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 }
原文地址:https://www.cnblogs.com/xiaochi/p/8494504.html