- 广播:
一台主机
可以将一个数据包
同时发送给同一局域网
内所有主机
;
- 在
IPV4
中,广播地址
是本网段最大的IP地址
或者"255.255.255.255
";
- 注意:
- 广播
本质
上是UDP通信
技术;
- 只有
用户数据报套接字
才能使用广播
的方式;
- 设置广播的流程:
- 发送方(UDP的客户端):
- 一、创建用户数据报套接字(socket函数):
c
复制代码
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sockfd)
{
perror("sockfd error");
exit(-1);
}
- 二、填充广播信息结构体( struct sockaddr_in):
c
复制代码
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函数):
c
复制代码
int opt = 1;
if(-1 == (setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt))))
{
perror("setsockopt error");
exit(-1);
}
c
复制代码
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);
}
}
c
复制代码
close(sockfd);
- 接收方(UDP的服务器):
- 一、创建用户数据报套接字(socket函数):
c
复制代码
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sockfd)
{
perror("sockfd error");
exit(-1);
}
- 二、填充广播信息结构体(struct sockaddr_in):
c
复制代码
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函数):
c
复制代码
if(-1 == (bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len)))
{
perror("bind error");
exit(-1);
}
c
复制代码
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);
}
c
复制代码
close(sockfd);