zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    关于springMVC转换json出现的异常
    jQuery实现,动态自动定位弹窗。JS分页,Ajax请求
    servlet为什么要配置web.xml
    Jmeter系列(4)- Jmeter 脚本录制
    后缀数组模板
    NOIP2016 玩脱记
    TERSUS无代码开发(笔记21)-流程执行顺序思考(转载)
    ===>===>===>特色思TERSUS常用功能整理
    TERSUS无代码开发(笔记20)-本地开发测试mysql数据库连接
    TERSUS无代码开发(笔记19)-mysql-connector-java-5.-bin.jar下载方法
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8494504.html
Copyright © 2011-2022 走看看