- 广播:
一台主机
可以将一个数据包
同时发送给同一局域网
内所有主机
;- 在
IPV4
中,广播地址
是本网段最大的IP地址
或者“255.255.255.255
”; - 注意:
- 广播
本质
上是UDP通信
技术; - 只有
用户数据报套接字
才能使用广播
的方式; - 设置广播的流程:
- 发送方(UDP的客户端):
- 一、创建用户数据报套接字(socket函数):
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sockfd)
{
perror("sockfd error");
exit(-1);
}
- 二、填充广播信息结构体( struct sockaddr_in):
struct sockaddr_in serveraddr;
socklen_t serveraddr_len = sizeof(serveraddr);
memset(&serveraddr,0,serveraddr_len);
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(IP);
serveraddr.sin_port = htons(PORT);
- 三、设置允许发送广播(setsockopt函数):
int opt = 1;
if(-1 == (setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt))))
{
perror("setsockopt error");
exit(-1);
}
char buf[128] = {0};
while(true)
{
memset(buf,0,sizeof(buf));
fgets(buf,128,stdin);
buf[strlen(buf)-1] = '\0';
if(!strncmp(buf,"quit",4))
{
break;
}
if(-1 == (sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&serveraddr,serveraddr_len)))
{
perror("sendto error");
exit(-1);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
close(sockfd);
- 接收方(UDP的服务器):
- 一、创建用户数据报套接字(socket函数):
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sockfd)
{
perror("sockfd error");
exit(-1);
}
- 二、填充广播信息结构体(struct sockaddr_in):
struct sockaddr_in serveraddr,clientaddr;
socklen_t serveraddr_len = sizeof(serveraddr);
socklen_t clientaddr_len = sizeof(clientaddr);
memset(&serveraddr,0,serveraddr_len);
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(IP);
serveraddr.sin_port = htons(PORT);
- 三、用户数据报套接字和广播信息结构体绑定(bind函数):
if(-1 == (bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len)))
{
perror("bind error");
exit(-1);
}
char buf[128] = {0};
while(true)
{
memset(buf,0,sizeof(buf));
if(-1 == (recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&clientaddr_len)))
{
perror("recvfrom error");
exit(-1);
}
printf("客户端[%s:%d]发来数据[%s]\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),buf);
}
close(sockfd);