`
memorymyann
  • 浏览: 266329 次
  • 性别: 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内核在发现要发送广播,而数据又过长需要分片的时候,直接将数据截断变成无需分片的大小。

分享到:
评论

相关推荐

    2计算机网络复习题.doc

    一、选择题 1.MAC地址通常... A.192.168.0.0 B.192.168.23.32 C.192.168.0.96 D.192.168.23.96 6.如果子网掩码是255.255.0.0,那么下列地址为子网112.11.0.0内的广播地址的是( )。 A.112.11.0.0 B.112.11.25

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

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

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

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

    DCS-3726S-配置管理手册-V4.0

    1.9 广播风暴 ..........................................................................................................................................................20 1.9.1 分割广播域................

    linux网路编程 中文 23M 版

    23 2.2.6 预处理........................................................ 24 2 . 2 . 7编译成汇编语言.................................................24 2 . 2 . 8生成和使用静态链接库.......................

    西门子MM440变频器手册

    西门子变频器MM440手册 MICROMASTER 440通用型变频器 0.12kW - 250kW 使用大全 版本 12/03 用户文件 6SE6400-5AW00-0BP0 目录 1 概况.....................................................................

    3GPP-23501-g10(中文版).pdf

    3GPP TS 23.501 V16.1.0(2019-06 年)5G 系统的系统架构; 第二阶段 (版本 16) 目录 前言 15 1 范围 16 2 参考文献 16 3 定义和缩写 20 3.1 定义 20 3.2 缩写 24 4 架构(architecture)模型和概念 26 4.1 一般...

    中国电信智慧小区方案.pdf

    23 第四章 基于 RF-SIM 卡的智能一卡通系统....................................................................................... 23 4.1 智能一卡通系统概述.................................................

    802.11无线网络权威指南(第二版全_非扫描).pdf

    3.5.1 广播与组播数据或管理帧................................................................... 66 3.5.2 单点传播帧........................................................................................

    Android系统源代码情景分析光盘

    23 2.2 开发C可执行程序验证Android硬件驱动程序............................................... 24 2.3 开发Android硬件抽象层模块................................. 26 2.3.1 硬件抽象层模块编写规范.........

    DSP2812试验箱软件手册(节选)

    5.3.3 使用 PDM 来进行多处理器广播命令................................................... 26 5.4 断点(Breakpoints) .......................................................................................

    计算机网络原理精讲视频.zip

    23.数据链路层基本概念 24.封装成帧和透明传输 25.差错检测 26.点到点通信数据链路层协议PPP 27.配置路由器使用PPP协议 28.广播信道的数据链路层 29.CSMA_CD协议技术细节 30.什么是以太网 31.以太网帧格式 32.抓包...

    博士智能语音广播系统 v6.6.zip

    23、用户可以自定义词典,让您可以随意变化读音,并且可以校正多音字。 24、各种操作都有提示,专业而又不失易用性。 25、系统功能强大,运行稳定,操作简便,界面美观大方(12套皮肤可供用户选择)。 26、注册...

    Android开发指南中文版

    23 进程与生命周期 .............................................................................................. 24 用户界面User Interface ..............................................................

    3GPP TS 23.003 V15.6.0中英文翻译对照版本(超详细).docx

    8、语音组呼服务(VGCS)和语音广播服务(VBS)的用户组的识别计划;语音组呼和语音广播呼叫的识别方案;集体电话区域的识别计划; 9、为了支持订户身份机密性服务,VLR,SGSN和MME可以将临时移动订户身份(TMSI)分配...

    TCP/IP详解

    第23章 TCP的保活定时器 251 23.1 引言 251 23.2 描述 252 23.3 保活举例 253 23.3.1 另一端崩溃 253 23.3.2 另一端崩溃并重新启动 254 23.3.3 另一端不可达 254 23.4 小结 255 第24章 TCP的未来和性能 256 24.1 ...

    Squid中文权威指南

    译者序: 本人在工作中维护着数台Squid服务器,多次参阅Duane Wessels(他也是Squid的创始人)的这本书,原书名是"Squid: The Definitive Guide",由O'Reilly出版。我在业余时间把它翻译成中文,希望对中文Squid用户...

Global site tag (gtag.js) - Google Analytics