广播
发送端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IP "192.168.0.255"//广播地址
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建套接字文件描述符
//定义通用结构体变量并填充结构体数据
//定义通用地址结构变量来接收服务器数据
//发送数据
//接收数据
//关闭文件描述符
int cfd=socket(AF_INET,SOCK_DGRAM,0);
if(cfd < 0)
{
perror("socke");
return -1;
}
printf("UDP套接字文件描述符sfd= %d \n",cfd);
//设置允许广播
int broad =1;
if(setsockopt(cfd,SOL_SOCKET,SO_BROADCAST,&broad,sizeof(broad)) < 0)
{
perror("setsockopt");
return -1;
}
printf("set broadcast success\n");
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
struct sockaddr_in cin;
socklen_t size_sin=sizeof(cin);
char temp[128]="";
ssize_t res =0;
while(1)
{
bzero(temp,sizeof(temp));
printf("请输入---");
fgets(temp,sizeof(temp),stdin);
temp[strlen(temp)-1]=0;
if( sendto(cfd,temp,sizeof(temp),0,(struct sockaddr*)&sin,sizeof(sin)) <0)
{
perror("recvfrom");
return -1;
}
printf("发送成功\n");
}
close(cfd);
return -1;
}
接收端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IP "192.168.0.255"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建套接字文件描述符
//定义通用结构体变量并填充结构体数据
//定义通用地址结构变量来接收服务器数据
//发送数据
//接收数据
//关闭文件描述符
int cfd=socket(AF_INET,SOCK_DGRAM,0);//数据报的形式创建套接字并获取文件描述符
if(cfd < 0)
{
perror("socke");
return -1;
}
printf("UDP协议--数据报套接字文件描述符sfd= %d \n",cfd);
struct sockaddr_in cin;//创建通用地址结构变量,填充IP协议,端口号,IP地址
cin.sin_family=AF_INET;
cin.sin_port=htons(PORT);
cin.sin_addr.s_addr=inet_addr(IP);
if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))< 0)//经由socket的文件描述符及一个指向存有通用地址数据的结构体变量和该地址的数据大小(数据长度)来进行绑定
{
perror("bind");
return -1;
}
struct sockaddr_in sin;//定义一个新的地址变量
socklen_t size_sin=sizeof(sin);//
char temp[128]="";
ssize_t res =0;
while(1)
{
bzero(temp,sizeof(temp));
res = recvfrom(cfd,temp,sizeof(temp),0,(struct sockaddr*)&sin,&size_sin);//通过socket的文件描述符及temp指向的临时容器中转数据并将数据中包含发送者的地址数据存储到指针指向的地址数据
if(res < 0 )
{
perror("recvfrom");
return -1;
}
printf("[地址:%s 端口:%d] recvfrom:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),temp);
}
close(cfd);
return -1;
}
组播
发送端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IP "224.1.2.3"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建套接字文件描述符
int cfd =socket(AF_INET,SOCK_DGRAM,0);
if(cfd < 0)
{
perror("socket");
return -1;
}
printf("UDP套接字文件描述符sfd= %d \n",cfd);
//定义通用结构体变量并填充结构体数据
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
char temp[128]="";
ssize_t res =0;
while(1)
{
bzero(temp,sizeof(temp));
printf("请输入--");
fgets(temp,sizeof(temp),stdin);
temp[strlen(temp)-1]=0;
//发送数据程序体
if(sendto(cfd,temp,sizeof(temp),0,(struct sockaddr*)&sin,sizeof(sin)) < 0)
{
perror("sendto");
return -1;
}
printf("信息发送成功\n");
}
//关闭文件描述符
close(cfd);
return -1;
}
接收端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IP "192.168.0.199"
#define GRP_IP "224.1.2.3"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建套接字文件描述符
int sfd =socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0)
{
perror("socket");
return -1;
}
printf("UDP套接字文件描述符sfd= %d \n",sfd);
//加入多播组
struct ip_mreqn mq;
mq.imr_multiaddr.s_addr =inet_addr(GRP_IP);
mq.imr_address.s_addr =inet_addr(IP);
mq.imr_ifindex =2;//网卡号
if(setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mq,sizeof(mq)) <0)
{
perror("setsockopt");
return -1;
}
printf("加入多播组成功\n");
//定义通用结构体变量并填充结构体数据
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);//端口号
sin.sin_addr.s_addr=inet_addr(GRP_IP);//组IP号
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
{
perror("bind");
return -1;
}
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
char temp[128]="";
ssize_t res =0;
while(1)
{
bzero(temp,sizeof(temp));
//发送数据程序体
res = recvfrom(sfd,temp,sizeof(temp),0,(struct sockaddr*)&cin,&addrlen);
if(res <0)
{
perror("sendto");
return -1;
}
printf("[%s :%d ] %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),temp);
}
//关闭文件描述符:w
close(sfd);
return -1;
}