UDP通讯协议|UDP通讯协议广播和组播实现

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;
}

    推荐阅读