广播
发送端
#include <myhead.h>
int main(int argc, const char *argv[])
{
//1.创建套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd==-1){
perror("socket error");
return -1;
}
printf("sfd=%d\n",sfd);
//2.设置当前套接字允许广播属性
int broadcast=-1;
if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1){
perror("setsockopt error");
return -1;
}
//3.绑定(非必须)
//4.填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=(8888); //广播端口号
sin.sin_addr.s_addr=inet_addr("192.168.199.255"); //广播地址
//5.发送数据
char sbuf[128]="";
while(1)
{
//从终端获取数据
printf("请输入>>>");
fgets(sbuf,sizeof(sbuf),stdin);
sbuf[strlen(sbuf)-1]=0;
//发送数据
sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
printf("发送成功\n");
}
//6.关闭套接字
close(sfd);
return 0;
}
接收端
#include <myhead.h>
int main(int argc, const char *argv[])
{
//1.创建套接字
int cfd=socket(AF_INET,SOCK_DGRAM,0);
if(cfd==-1){
perror("socket error");
return -1;
}
printf("cfd=%d\n",cfd);
//2.绑定
//填充地址信息结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=(8888); //广播端口号
cin.sin_addr.s_addr=inet_addr("192.168.199.255"); //广播地址
//绑定
if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){
perror("bind error");
return -1;
}
printf("bind success\n");
//3.接收数据
char rbuf[128]="";
while(1)
{
//清空数据
bzero(rbuf,sizeof(rbuf));
//读取消息
recvfrom(cfd,rbuf,sizeof(rbuf),0,NULL,NULL);
printf("收到的消息为:%s\n",rbuf);
}
//4.关闭套接字
close(cfd);
return 0;
}
组播
发送端
#include <myhead.h>
int main(int argc, const char *argv[])
{
//1.创建套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd==-1){
perror("socket error");
return -1;
}
//2.绑定(非必须)
//3.发送消息
//填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(8888); //组播端口号
sin.sin_addr.s_addr=inet_addr("224.1.1.2"); //组播IP
char sbuf[128]="";
while(1)
{
//从终端获取数据
printf("请输入>>>");
fgets(sbuf,sizeof(sbuf),stdin);
sbuf[strlen(sbuf)-1]=0;
//发送数据
sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));
printf("发送成功\n");
}
//4.关闭套接字
close(sfd);
return 0;
}
接收端
#include <myhead.h>
int main(int argc, const char *argv[])
{
//1.创建套接字
int rfd=socket(AF_INET,SOCK_DGRAM,0);
if(rfd==-1){
perror("socket error");
return -1;
}
printf("rfd=%d\n",rfd);
//2.加入多播组
struct ip_mreqn imr;
imr.imr_multiaddr.s_addr=inet_addr("224.1.1.2"); //组播ip
imr.imr_address.s_addr=inet_addr("192.168.199.131"); //本机ip
imr.imr_ifindex=2; //网卡编号
if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1){
perror("setsockopt error");
return -1;
}
//3.绑定
//填充地址信息结构体
struct sockaddr_in rin;
rin.sin_family=AF_INET;
rin.sin_port=htons(8888); //组播端口号
rin.sin_addr.s_addr=inet_addr("224.1.1.2"); //组播ip
//绑定
if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){
perror("bind error");
return -1;
}
printf("bind success\n");
//4.接收组播消息
char rbuf[128]="";
while(1)
{
//清空消息
bzero(rbuf,sizeof(rbuf));
//接收消息
recvfrom(rfd,rbuf,sizeof(rbuf),0,NULL,NULL);
printf("收到的消息为:%s\n",rbuf);
}
//5.关闭套接字
close(rfd);
return 0;
}