UDP 通讯协议广播
UDP广播发送端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//自动匹配发送端的ip
bindaddr.sin_port=htons(20000);
//发送端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
otheraddr.sin_family=AF_INET;
otheraddr.sin_addr.s_addr=inet_addr("192.168.22.255");
//我们课室局域网广播地址
otheraddr.sin_port=htons(30000);
//端口号
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//设置套接字的属性为可以广播
setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
//广播信息给我们课室所有的主机
while(1)
{
bzero(sbuf,100);
printf("请输入要广播发送的信息!\n");
scanf("%s",sbuf);
sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
}
//关闭
close(udpsock);
return 0;
}
UDP广播接收端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//自动匹配接收端的ip
bindaddr.sin_port=htons(30000);
//接收端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
int addrsize=sizeof(otheraddr);
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//接收广播信息
while(1)
{
bzero(sbuf,100);
recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
printf("ip地址是:%s 端口号是:%hu 广播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
}
//关闭
close(udpsock);
return 0;
}
UDP通讯协议组播
UDP组播发送端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//自动匹配发送端的ip
bindaddr.sin_port=htons(20000);
//发送端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
otheraddr.sin_family=AF_INET;
otheraddr.sin_addr.s_addr=inet_addr("225.168.22.7");
//我选定的组播组地址
otheraddr.sin_port=htons(30000);
//端口号
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//设置套接字的属性为可以广播
setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
//组播信息给加入到我指定的组播组里面的机器
while(1)
{
bzero(sbuf,100);
printf("请输入要组播发送的信息!\n");
scanf("%s",sbuf);
sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
}
//关闭
close(udpsock);
return 0;
}
UDP组播接收端
#include "myhead.h"
【UDP通讯协议|UDP通讯协议广播和组播实现】int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//自动匹配接收端的ip
bindaddr.sin_port=htons(30000);
//接收端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
int addrsize=sizeof(otheraddr);
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//加入到发送端指定的那个组播组里面
struct ip_mreq mreq;
//定义结构体变量保存组播组信息
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr("225.168.22.7");
//D类地址
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
// 必须用这个宏定义
setsockopt(udpsock, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));
//把这个主机添加到组播组里面
//接收组播信息
while(1)
{
bzero(sbuf,100);
recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
printf("ip地址是:%s 端口号是:%hu 组播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
}
//关闭
close(udpsock);
return 0;
}