Linux 网络通信之广播

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 <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <arpa/inet.h>
 7 #include <netinet/in.h>
 8 #include <string.h>
 9
10 #define  err_log(log) do{perror(log); exit(1);}while(0)
11
12 #define  N 128
13
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 <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <arpa/inet.h>
 7 #include <netinet/in.h>
 8 #include <string.h>
 9
10 #define  err_log(log) do{perror(log); exit(1);}while(0)
11 #define  N  128
12
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 }
时间: 2024-11-10 13:49:06

Linux 网络通信之广播的相关文章

linux网络通信的命令详细介绍

---------------------------------------网络通信的命令----------------------------------------------- 一:write 功能:给用某个户发信息(对方必须登录,要不能是收不到的) 场景:1:现在linux服务器有2个用户在工作:root .leyangjun 2:root在北京 leyangjun 在上海 3: 两人都同时登录系统工作 交流类似QQ,实时通信 root: write leyangjun (写命令)

linux网络通信中的地址形式转换

对于IPv4协议来说,ip是一个32位的整数,对于IPv6来说,ip是一个128位的整数.在内存中,ip都以二进制的形式存储,但是不易于观察,所以 可以转化将其转化为点分十进制的表达形式. 在linux中,提供了 ip二进制和点分十进制互相转化的函数: inet_ntop 将二进制转化为点分十进制,af表示使用的协议,AF_INET表示使用的是IPv4,AF_INET6表示使用的IPv6,src是一个表示ip的 struct in_addr的结构体,dst是用来存储ip点分十进制形式的字符串,s

Linux网络通信命令

1.write 功能:给该系统内的制定用户发送信息 语法:write 用户名 2.wall 功能:给所有用户发广播 3.ping 语法:ping -c 次数 IP 4.ifconfig 功能:查看网络设置信息 语法: ifconfig -a  //显示所有网卡信息 此外,ifconfig eth0 新的IP地址 ,该语句可以实现在此终端内改变本机的IP,要想永久更改本机的IP地址,必须写入相应的配置文件中 其他命令: 1.shutdown 关机命令 shutdown -h now //立刻关机

linux网络通信

很老了的代码了,呵呵  最近在复习呢 //server #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> typede

Linux网络编程——广播

概述 在生活中广播无处不在,像平时在大街上卖物品的商人,在进行推广产品的时候往往都是使用一个喇叭来进行吆喝:"十块钱买不了吃亏,十块钱买不了上当,走过路过千万不要错过",这就是广播. 那么在网络中的广播又是什么样子的呢? 网络上的广播指:由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式.如下图的 1 号主机广播给 2.3.4.5 号主机发送数据: 实现广播,离不开广播地址,同一个子网(局域网)的所有主机网卡都会接收所在网段广播地址的数据包.广播地址应用于局域网内的所

在 Linux 终端收听广播

MPlayer 是一个多功能的开源媒体播放器,它在 Linux 命令行中非常有用. 你已经看到我们为期 24 天的 Linux 命令行玩具日历.如果这是你第一次访问该系列,你可能会问自己什么是命令行玩具.它可能是一个游戏或任何简单的消遣,可以帮助你在终端玩得开心. 你们中的一些人之前已经看过我们日历中的各种玩具,但我们希望每个人至少见到一件新玩具. 在命令行中有很多方法可以听音乐.如果你有本地存储的媒体,cmus 是一个很好的选择,但还有 很多其他选择 . 不过,很多时候,当我在终端的时候,我会

linux 网络通信

网络命令 历史上最早的即时通信 1 write linzhiling (内容) ctrl+D结束 这样一封信就写出去了,注意:只有用户在线才可以发送 2 wall (write all) 给所有的用户写信 3 ping命令 ping 192.168.1.1 注意:主要看丢包率,丢包率高说明网络状态不好 ifconfig 查看网卡 如果临时设定网卡地址:ifconfig eth0 192.168.214.11 4 mail 给用户发送邮件 mail root 直接按照格式书写 在mail 下面直接

[Linux入门书籍]推荐

成为一名精通 Linux 程序设计的高级程序员一直是不少朋友孜孜以求的目标.根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows 程序员的 1.8 倍.Java 程序员的 2.6 倍, Linux 程序员年终奖金平均为 Windows 程序员的 2.9 倍.同时数据显示,随着工作经验的增长, Linux 程序员与 Windows 程序员的收入差距还有扩大的趋势.Denis 认为,要学好 Linux 环境下的编程,关键是要看对.选对.学会正确的书籍.可以说,如果你选对了

【转】linux驱动开发的经典书籍

原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本侧重于实战的书籍也只能停留在基本的接口介绍上,更深入的东东只能靠我们自己摸索了.但万事总有一个开头,没有对Linux驱动整体框架的把握是很难做一个优秀的驱动开发者的.除了