博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 网络通信之广播
阅读量:5917 次
发布时间:2019-06-19

本文共 2639 字,大约阅读时间需要 8 分钟。

IP地址用来标识网络中的一台主机。IPV4协议用一个32位的无符号数表示网络地址,包括网络号和主机号。子网掩码表示IP地址中网络号占几个字节。

每个网段都有对应的广播地址。以C类网段192.168.1.x为例,其中最小的地址192.168.1.0代表该网段;而最大的地址192.168.1.255则是该网段中的广播地址。当我们想这个地址发送数据包时,该网段的所有主机都会接收并处理。

广播包的发送和接收通过UDP套接字实现

广播包发送流程如下:

(1)创建UDP套接字;socket(AF_INET, SOCK_DGRAM, 0)

(2)填充广播信息结构体;struct sockaddr_in

(3)设置套接字选项允许发送广播包;setsockopt(, ,SO_BROADCAST, ,)

(4)发送数据包;sendto( )

send.c

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 10 #define err_log(log) do{perror(log); exit(1);}while(0)11 12 #define N 12813 14 int main(int argc, const char *argv[])15 {16 17 int sockfd;18 struct sockaddr_in broadcastaddr;19 char buf[N] = { 0};20 21 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)22 {23 err_log("fail to socket");24 }25 26 broadcastaddr.sin_family = AF_INET;27 broadcastaddr.sin_addr.s_addr = inet_addr("192.168.1.255");28 broadcastaddr.sin_port = htons(10000);29 30 int optval = 1;31 32 if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(int)) < 0)33 {34 err_log("fail to setsockopt");35 }36 37 while(1)38 {39 printf("Input > ");40 fgets(buf, N, stdin);41 if(sendto(sockfd,buf, N, 0, (struct sockaddr *)&broadcastaddr, sizeof(broadcastaddr)) < 0)42 {43 err_log("fail to sendto");44 }45 46 }47 48 return 0;49 }

 

 

广播包接收流程如下:

(1)创建UDP套接字;socket(AF_INET, SOCK_DGRAM, 0)

(2)填充广播信息结构体;struct sockaddr_in

(3)绑定地址和端口;bind( )

(4)接收数据包;recvfrom( )

recv.c

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 10 #define err_log(log) do{perror(log); exit(1);}while(0)11 #define N 12812 13 int main(int argc, const char *argv[])14 {15 16 int sockfd;17 char buf[N];18 struct sockaddr_in broadcastaddr, srcaddr;19 20 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)21 {22 err_log("fail to socket");23 }24 25 broadcastaddr.sin_family = AF_INET;26 broadcastaddr.sin_addr.s_addr = inet_addr("192.168.1.255");27 broadcastaddr.sin_port = htons(10000);28 29 if(bind(sockfd, (struct sockaddr*)&broadcastaddr, sizeof(broadcastaddr)) < 0)30 {31 err_log("fail to bind");32 }33 34 socklen_t addrlen = sizeof(struct sockaddr);35 36 while(1)37 {38 if(recvfrom(sockfd,buf, N, 0, (struct sockaddr *)&srcaddr, &addrlen) < 0)39 {40 err_log("fail to sendto");41 }42 printf("buf:%s ---> %s %d\n", buf, inet_ntoa(srcaddr.sin_addr), ntohs(srcaddr.sin_port));43 }44 45 return 0;46 }

 

转载于:https://www.cnblogs.com/yangziwen0709/p/5025902.html

你可能感兴趣的文章
ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗...
查看>>
Recurrent Neural Network[Quasi RNN]
查看>>
内核中的锁机制--RCU
查看>>
课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 2、Practice Questions...
查看>>
FTP&samba 服务简单部署
查看>>
正则表达式30分钟入门教程
查看>>
vue基础指令
查看>>
[转]How can I list all foreign keys referencing a given table in SQL Server?
查看>>
Android系统设置Android adb 开关的方法【转】
查看>>
EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
查看>>
Tornado中gen.coroutine详解
查看>>
大型情感类电视连续剧--Android高德之旅(2)地图类型
查看>>
这款数据恢复软件新春特惠,买起来!
查看>>
面试准备
查看>>
小米3移动版 分区 调整/合并教程(16GB/64GB)
查看>>
转载 编码人员,程序员,开发人员和软件工程师之间的差异 你是哪种?
查看>>
使用Python的turtle库实现七段数码管绘制
查看>>
tcp流协议产生的粘包问题和解决方案
查看>>
win10运行LoadRunner Controller遇到的坑
查看>>
XML文件生成C++代码(基于rapidxml)
查看>>