【计算机网络】UDP中实现广播

🔥博客主页: 我要成为C++领域大神

🎥系列专栏【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】

❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于分享知识,欢迎大家共同学习和交流。

广播分为两种,直接广播和有限广播,

直接广播

在某个网段内发送数据可以跨路由器,通过直接广播,就是将这个网段的网络号不变,主机号变为全1,即x.x.x.255
例如广播地址是192.168.3.255,那么网段为192.168.3.xxx的所有主机都会收到。
将UDP协议的服务端和客户端代码进行稍微修改,可以实现广播。
将客户端中目的主机的IP修改为192.168.3.255,这样就是所有网段为192.168.3.xxx的主机均可以收到。
将客户端的接收代码注释,并且将服务端的发送代码注释掉

 sockaddr_in sockServer;
 sockServer.sin_family = AF_INET;
 //sockServer.sin_port = htons(9876);  //设置端口号
 //sockServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.186");
 sockServer.sin_port = htons(98765);  //设置端口号
 sockServer.sin_addr.S_un.S_addr = inet_addr("192.168.3.255");

 char recvBuf[4096] = "";
 char sendBuf[4096] = "";
 int recv = 0;
 int send = 0;
 cout << "-----Client init over-----" << endl;
 while (true)
 {
     //5、发送数据
     cout << "Client send: ";
     gets_s(sendBuf);
     send=sendto(sock, sendBuf, sizeof(sendBuf), 0, (sockaddr*)&sockServer, sizeof(sockServer));
     if (SOCKET_ERROR == send) {
         cout << "sendto fail" << endl;
     }
 }

实现结果如图所示:

有限广播

有限广播是向局域网中任意网段发送数据,发送地址是255.255.255.255,不能跨路由器进行。
有限广播需要设置一个广播权限,使用setsockopt函数。函数的返回值是0或者SOCKET_ERROR,若返回0说明正常设置权限。

int WSAAPI setsockopt(
  [in] SOCKET     s, 
  [in] int        level,
  [in] int        optname,
  [in] const char *optval,
  [in] int        optlen
);

第一个参数是需要设置权限的套接字;第二个参数是定义选项的级别,填写SOL_SOCKET;第三个参数的选项名称,要设置广播就填写SO_BROADCAST;第四个参数是指向指定请求选项值的缓冲区的指针,是给广播权限设置的数值,TRUE是设置广播权限,FALSE是取消广播权限;第五个参数是指向缓冲区的大小,也就是第四个参数的大小。
对客户端代码进行修改:


    //设置有限广播权限
    BOOL bval = TRUE;
    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bval, sizeof(bval));

    sockaddr_in sockServer;
    sockServer.sin_family = AF_INET;
    //sockServer.sin_port = htons(9876);  //设置端口号
    //sockServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.186");  //直接广播
    sockServer.sin_port = htons(98765);  //设置端口号
    sockServer.sin_addr.S_un.S_addr = inet_addr("255.255.255.255"); //有限广播 

    char recvBuf[4096] = "";
    char sendBuf[4096] = "";
    int recv = 0;
    int send = 0;
    cout << "-----Client init over-----" << endl;
    while (true)
    {
        //5、发送数据
        cout << "Client send: ";
        gets_s(sendBuf);
        send=sendto(sock, sendBuf, sizeof(sendBuf), 0, (sockaddr*)&sockServer, sizeof(sockServer));
        if (SOCKET_ERROR == send) {
            cout << "sendto fail" << endl;
        }     
    }

可以达到相同的效果。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值