`
memorymyann
  • 浏览: 271927 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

23.广播

阅读更多

如果想发送广播到目前为止只能使用AF_INET, SOCK_DGRAM,也就是说只能采用基于IPV4的UDP协议才能发送广播。

 

IP地址有32位组成,如果想向某个网段发送广播,只需要那个发送的IP地址的主机号改成全1即可。比如大家最常用的局域网内部广播,我的网络地址为192.168.1.xxx。因此我只需要发送地址改为192.168.1.255.另外路由不转发广播,也就是说:处于192.168.1.xxx网段的广播是不会发送到192.168.2.xxx网段上。这也是说主机192.168.1.221如果想发送192.168.2.xxx的广播是行不通的。

 

代码就很简单的,但是有点要注意的是:必须通过套接口选项SO_BROADCAST设置,明确的告诉路由,你要发送的是广播,不然是无法发送出去。

 

发送代码:

 

#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"

#define MAXSIZE 100

int main(int argc, char ** argv) {
        int sockfd;
        struct sockaddr_in serv_socket;
        int maxfdpl;
        char send[] = "hello world";

        if(argc != 2) {
                printf("please input port");
                exit(1);
        }

        sockfd = socket(AF_INET, SOCK_DGRAM, 0);/发送广播,必须采用AF_INET,SOCK_DGRAM才可以
        bzero(&serv_socket, sizeof(serv_socket));
        serv_socket.sin_family = AF_INET;
        serv_socket.sin_port = htons(atoi(argv[1]));

        const int on = 1;
        setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));//设置套接口选项SO_BROADCAST明确告诉路由发送的是广播

        inet_pton(AF_INET, "192.168.1.255", &serv_socket.sin_addr);
        int temp = sendto(sockfd, send, sizeof(send), 0, (struct sockaddr *)&serv_socket, sizeof(struct sockaddr_in));
        if(temp == -1)
                printf("system message:send failed\n");
}

 

接受代码:

#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "sys/wait.h"
#include "sys/select.h"
#include "sys/poll.h"

#define MAXSIZE 100

int main(int argc, char ** argv) {
        int sockfd;
        struct sockaddr_in serv_socket;
        struct sockaddr_in * client_socket = NULL;
        char send[MAXSIZE + 1];
        char recv[MAXSIZE + 1];

        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        bzero(&serv_socket, sizeof(serv_socket));
        serv_socket.sin_family = AF_INET;
        serv_socket.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_socket.sin_port = htons(atoi(argv[1]));
        bind(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));
        socklen_t len = sizeof(client_socket);
        client_socket = (struct sockaddr_in *) malloc (sizeof(struct sockaddr_in));

        int n = recvfrom(sockfd, recv, MAXSIZE, 0, (struct sockaddr *)client_socket, &len);
        recv[n] = '\0';
        printf("client message:%s\n", recv);
}

 

另外唯一要注意的是:发送的广播时候传输的数据不应过长,因为广播的是不会被分片,也就是说如果超过了MTU,数据包会被丢弃。不分片的原因是因为设计者认为广播已经给网络带来了很大的负担,没必要再通过分片将这种负担扩大数倍。

 

另外,高层的SOCKET也会处理,至少在我所执行的fedora环境下,当我试图把发送的内容buf扩大至10000个字符时候,并没有出现因不分片而导致的错误,接受端仍然接受到了数据,不过数据是被截断后的数据(要远远小于10000个字符),我怀疑原因:可能是linux内核在发现要发送广播,而数据又过长需要分片的时候,直接将数据截断变成无需分片的大小。

分享到:
评论

相关推荐

    3GPP TS 23.038

    首先,文件标题为 "3GPP TS 23.038",文档描述为 "3GPP TS 23.038 version 8.3.0 Release 8"。这里,“3GPP”是第三代合作伙伴计划(3rd Generation Partnership Project)的缩写,它是一个全球性组织,负责制定移动...

    3GPP TS 23.502 version 15.2.0 Release 15

    Release 16在Release 15的基础上进一步优化和增强了5G的功能,增加了工业物联网(IIoT)和增强的多播广播服务(eMBMS)等特性,而Release 17则重点发展了5G Advanced的能力。 文件中还提到了一些组织和商标信息,...

    广播电视新闻业务概念、问答题分享.pdf

    23. 广播电视现场报道:记者直接在新闻现场进行报道,结合现场实况和采访,增强报道的即时性和现场感。 24. 现场报道的题材选择要求事件的时间、空间集中,且充满悬念和不确定性,让观众能跟随记者一同探索未知。 ...

    全国广电系统记者编辑资格考试新闻.pdf

    23. 广播电视新闻结构要求:单一线索、层次清晰、核心信息突出,确保信息传达的有效性。 24. 广播电视消息定义:快速及时、简洁扼要地报道新闻事实,利用视听媒体特性传递信息。 以上是全国广电系统记者编辑资格...

    校园无线数字多媒体广播信息发布系统建设方案.docx

    23 本方案详尽介绍了**中学的"DMB+无线数字多媒体广播信息发布系统"的建设规划。DMB+技术是一种先进的数字广播技术,它结合了多媒体信息传输的能力,能够提供高质量的声音和图像,极大地提升了校园广播的信息传播...

    汉源高科4个万兆光口+8个千兆combo光电复用口+16个千兆网口管理型万兆机架式工业级以太网交换机.docx

    23. 广播风暴抑制功能:支持广播风暴抑制功能,防止过多的广播、组播数据在网络泛洪,增强网络健壮性。 24. 协议支持:支持 G.8032 (ERPS)、IEEE802.3、IEEE802.3u、IEEE802.3z、IEEE802.3x、IEEE802.3ad、IEEE802....

    KXT23矿用IP网络广播系统用户手册.doc

    KXT23矿用IP网络广播系统用户手册 本文档是关于KXT23矿用IP网络广播系统用户手册的详细指南,旨在帮助用户快速掌握该系统的安装、配置、操作和维护。下面是该手册的主要知识点: 概述 KXT23矿用IP网络广播系统是...

    android系统广播

    23. Intent.ACTION_MEDIA_CHECKING:插入外部储存装置时的广播 24. Intent.ACTION_MEDIA_EJECT:拔掉外部大容量储存设备时的广播 25. Intent.ACTION_MEDIA_MOUNTED:插入 SD 卡并且已正确安装时的广播 26. Intent....

    2021年项目管理继续教育答案.pdf

    23. 广播系统精准时间控制:通过配备原则时间系统或卫星全球原则时间信号系统实现。 24. 建筑设备监控系统对给排水设备的要求:监控给排水泵的运行状态,包括故障报警和启停控制。 25. 智能化集成系统定义:通过...

    android发送UDP广播

    此外,如果应用运行在Android 6.0(API级别23)及以上,还需要在运行时请求`ACCESS_WIFI_STATE`和`CHANGE_WIFI_MULTICAST_STATE`权限。 总结来说,Android发送UDP广播涉及到网络编程基础,包括UDP套接字的创建、...

    发送无序广播

    自Android 6.0(API level 23)起,某些系统广播需要在运行时申请权限。例如,如果你的广播涉及到网络状态变化,需要`ACCESS_NETWORK_STATE`权限。此外,从Android 8.0(API level 26)开始,系统默认禁止后台服务...

    KXT23矿用IP网络广播系统方案.docx

    ### KXT23矿用IP网络广播系统方案 #### 1. 概述 KXT23矿用IP网络广播系统是一种专为煤矿井下设计的现代化广播解决方案,旨在克服传统模拟音频广播系统的诸多局限性。该系统充分利用了当前网络技术的优势,能够实现...

    Android获取系统拍照程序发出的广播

    在Android 6.0(API 23)及以上版本,由于运行时权限的引入,我们还需要在运行时请求存储权限,否则可能无法正常访问拍摄的照片。 ```java if (ContextCompat.checkSelfPermission(context, Manifest.permission....

    Android 利用广播发送通知

    自Android 6.0(API级别23)起,部分系统权限需要在运行时请求。如果需要在后台发送通知,可能需要请求“SYSTEM_ALERT_WINDOW”或“ACCESS_NOTIFICATION_POLICY”权限。 综上所述,"Android 利用广播发送通知"涉及...

    Android 广播大全 Intent Action 事件.

    23. Intent.ACTION_MEDIA_CHECKING:当插入外部储存装置时,系统会发出此广播,通知相关应用程序进行相应的处理。 知识点:外部储存装置是 Android 系统中的一种外部存储设备,应用程序可以根据这个事件来进行存储...

    android 接收屏幕广播例子

    要监听屏幕状态,需要在AndroidManifest.xml中添加`ACCESS_FINE_LOCATION`权限,因为从Android 6.0(API级别23)开始,对敏感权限的请求需要在运行时进行: ```xml <uses-permission android:name="android....

Global site tag (gtag.js) - Google Analytics