如果想发送广播到目前为止只能使用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内核在发现要发送广播,而数据又过长需要分片的时候,直接将数据截断变成无需分片的大小。
分享到:
相关推荐
一、选择题 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网络广播系统用户手册.doc
1.9 广播风暴 ..........................................................................................................................................................20 1.9.1 分割广播域................
23 2.2.6 预处理........................................................ 24 2 . 2 . 7编译成汇编语言.................................................24 2 . 2 . 8生成和使用静态链接库.......................
西门子变频器MM440手册 MICROMASTER 440通用型变频器 0.12kW - 250kW 使用大全 版本 12/03 用户文件 6SE6400-5AW00-0BP0 目录 1 概况.....................................................................
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 一般...
23 第四章 基于 RF-SIM 卡的智能一卡通系统....................................................................................... 23 4.1 智能一卡通系统概述.................................................
3.5.1 广播与组播数据或管理帧................................................................... 66 3.5.2 单点传播帧........................................................................................
23 2.2 开发C可执行程序验证Android硬件驱动程序............................................... 24 2.3 开发Android硬件抽象层模块................................. 26 2.3.1 硬件抽象层模块编写规范.........
5.3.3 使用 PDM 来进行多处理器广播命令................................................... 26 5.4 断点(Breakpoints) .......................................................................................
23.数据链路层基本概念 24.封装成帧和透明传输 25.差错检测 26.点到点通信数据链路层协议PPP 27.配置路由器使用PPP协议 28.广播信道的数据链路层 29.CSMA_CD协议技术细节 30.什么是以太网 31.以太网帧格式 32.抓包...
23、用户可以自定义词典,让您可以随意变化读音,并且可以校正多音字。 24、各种操作都有提示,专业而又不失易用性。 25、系统功能强大,运行稳定,操作简便,界面美观大方(12套皮肤可供用户选择)。 26、注册...
23 进程与生命周期 .............................................................................................. 24 用户界面User Interface ..............................................................
8、语音组呼服务(VGCS)和语音广播服务(VBS)的用户组的识别计划;语音组呼和语音广播呼叫的识别方案;集体电话区域的识别计划; 9、为了支持订户身份机密性服务,VLR,SGSN和MME可以将临时移动订户身份(TMSI)分配...
第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服务器,多次参阅Duane Wessels(他也是Squid的创始人)的这本书,原书名是"Squid: The Definitive Guide",由O'Reilly出版。我在业余时间把它翻译成中文,希望对中文Squid用户...