广播
向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP地址中子网内主机标志部分的二进制全部为1.
a、只能在局域网中使用
b、客户端需要绑定服务器广播使用的端口,才可以接收到广播消息
//设置广播属性的函数
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
-sockfd:文件描述符
-level:SOL_SOCKET
-optname:SO_BROADCAST
-optval:int类型的值,为1表示允许广播
-optlen:optval的大小
服务器端代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <arpa/inet.h>
6 int main()
7 {
8 //1、socket
9 int fd=socket(AF_INET,SOCK_DGRAM,0);
10 if(fd==-1)
11 {
12 perror("socket");
13 exit(-1);
14 }
15 //2、设置广播属性
16 int op=1;
17 setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&op,sizeof(op));
18 //3、创建广播的地址
19 struct sockaddr_in cliaddr;
20 cliaddr.sin_family=AF_INET;
21 cliaddr.sin_port=htons(9999);
22 inet_pton(AF_INET,"192.168.17.255",&cliaddr.sin_addr.s_addr);
23 //4、通信
24 int num=0;
25 while(1)
26 {
27 char sendbuf[128];
28 sprintf(sendbuf,"hello,client %d\n",num++);
29 //发送数据
30 sendto(fd,sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&cliaddr,sizeof(cliaddr));
31 sleep(1);
32 }
33 close(fd);
34 return 0;
35
36 }
客户端
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <arpa/inet.h>
6 int main()
7 {
8 int fd=socket(AF_INET,SOCK_DGRAM,0);
9 if(fd==-1)
10 {
11 perror("socket");
12 exit(-1);
13 }
14 //客户端绑定本地IP和端口
15 struct sockaddr_in addr;
16 addr.sin_family=AF_INET;
17 addr.sin_port=htons(9999);
18 addr.sin_addr.s_addr=INADDR_ANY;
19 bind(fd,(struct sockaddr*)&addr,sizeof(addr));
20 while(1)
21 {
22 char buf[128];
23 //接收数据
24 recvfrom(fd,&buf,sizeof(buf),0,NULL,NULL);
25 printf("server say:%s\n",buf);
26 sleep(1);
27 }
28 close(fd);
29 return 0;
30 }
客户端运行结果
你会发现,客户端接收到的服务端的信息并不是从0开始的,而是从12开始的,因为UDP传输本身是不稳定的,而且从什么数开始都是随机生成的,如果中断后重新开始就变成从 6开始了。