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>
910#define err_log(log) do{perror(log); exit(1);}while(0)
1112#define N 128
1314int main(int argc, constchar *argv[])
15{
1617int sockfd;
18struct sockaddr_in broadcastaddr;
19char buf[N] = {0};
2021if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
22 {
23 err_log("fail to socket");
24 }
2526 broadcastaddr.sin_family = AF_INET;
27 broadcastaddr.sin_addr.s_addr = inet_addr("192.168.1.255");
28 broadcastaddr.sin_port = htons(10000);
2930int optval = 1;
3132if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(int)) < 0)
33 {
34 err_log("fail to setsockopt");
35 }
3637while(1)
38 {
39 printf("Input > ");
40 fgets(buf, N, stdin);
41if(sendto(sockfd,buf, N, 0, (struct sockaddr *)&broadcastaddr, sizeof(broadcastaddr)) < 0)
42 {
43 err_log("fail to sendto");
44 }
4546 }
4748return0;
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>
910#define err_log(log) do{perror(log); exit(1);}while(0)
11#define N 128
1213int main(int argc, constchar *argv[])
14{
1516int sockfd;
17char buf[N];
18struct sockaddr_in broadcastaddr, srcaddr;
1920if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
21 {
22 err_log("fail to socket");
23 }
2425 broadcastaddr.sin_family = AF_INET;
26 broadcastaddr.sin_addr.s_addr = inet_addr("192.168.1.255");
27 broadcastaddr.sin_port = htons(10000);
2829if(bind(sockfd, (struct sockaddr*)&broadcastaddr, sizeof(broadcastaddr)) < 0)
30 {
31 err_log("fail to bind");
32 }
3334 socklen_t addrlen = sizeof(struct sockaddr);
3536while(1)
37 {
38if(recvfrom(sockfd,buf, N, 0, (struct sockaddr *)&srcaddr, &addrlen) < 0)
39 {
40 err_log("fail to sendto");
41 }
42 printf("buf:%s ---> %s %dn", buf, inet_ntoa(srcaddr.sin_addr), ntohs(srcaddr.sin_port));
43 }
4445return0;
46 }
原文:http://www.cnblogs.com/yangziwen0709/p/5025902.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!