1.组播
接收
#include <head.h>
#define ERR_MSG(msg) do{\
perror(msg);\
printf("__%d__\n",__LINE__);\
}while(0);
#define IP "224.1.2.23"
#define PORT 6557
int main(int argc,const char * argv[])
{
printf("接收端\n");
//创建报式套接字
int sdf = socket(AF_INET,SOCK_DGRAM,0);
if(sdf < 0){
ERR_MSG("socket");
return -1;
}
printf("报式套接字创建成功\n");
struct ip_mreqn mq;
mq.imr_multiaddr.s_addr = inet_addr(IP); //组播IP的网络字节序
mq.imr_address.s_addr = inet_addr("192.168.0.226"); //ifconfig的本机IP
mq.imr_ifindex = 3; //网络设备索引号
if((setsockopt(sdf, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mq,sizeof(mq))) < 0 ){
ERR_MSG("setsockopt");
return -1;
}
printf("加入多播组成功: %s\n", IP);
//一定需要绑定
//发送之前的准备
struct sockaddr_in sin;
sin.sin_family = AF_INET; //族连接在一起
sin.sin_port = htons(PORT); //端口转换成点分十进制
sin.sin_addr.s_addr = inet_addr(IP); //地址转变成网络字节序
socklen_t len = sizeof(sin);
if((bind(sdf,(struct sockaddr*)&sin,len)) < 0){
ERR_MSG("bind");
return -1;
}
//保存的信息及长度
struct sockaddr_in cin;
socklen_t len1 = sizeof(cin);
char buf[128] = "";
char str[128] = "";
int res = 0;
while(1){
memset(str,0,sizeof(str));
printf("__%d__\n",__LINE__);
res = recvfrom(sdf,str,sizeof(str),0,(struct sockaddr*)&cin,&len1);
if(res < 0){
ERR_MSG("recvfrom");
return -1;
}
printf("read:-->[%s]:[%d]%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),str);
}
close(sdf);
return 0;
}
2).发送
#include <head.h>
#define ERR_MSG(msg) do{\
perror(msg);\
printf("__%d__\n",__LINE__);\
}while(0);
#define IP "224.1.2.23"
#define PORT 6557
int main(int argc,const char * argv[])
{
printf("发送端\n");
//创建报式套接字
int sdf = socket(AF_INET,SOCK_DGRAM,0);
if(sdf < 0){
ERR_MSG("socket");
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(IP); //地址转变成网络字节序
socklen_t len = sizeof(sin);
struct sockaddr_in cin;
socklen_t len1 = sizeof(cin);
char buf[128] = "";
char str[128] = "";
int res = 0;
while(1){
memset(buf,0,sizeof(buf));
printf("请输入:\n");
scanf("%s",buf);
res = sendto(sdf,buf,sizeof(buf),0,(struct sockaddr*)&sin,len);
//res = sendto(sdf,buf,sizeof(buf),0,NULL,0);
if(res < 0){
ERR_MSG("sendto");
return -1;
}
memset(str,0,sizeof(str));
printf("__%d__\n",__LINE__);
res = recvfrom(sdf,str,sizeof(str),0,(struct sockaddr*)&cin,&len1);
if(res < 0){
ERR_MSG("recvfrom");
return -1;
}
printf("read:-->[%s]:[%d]%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),str);
}
return 0;
}
2.广播
服务器
#include <head.h>
#define ERR_MSG(msg) do{\
perror(msg);\
printf("__%d__\n",__LINE__);\
}while(0);
#define IP "192.168.74.255"
#define PORT 1562
int main(int argc,const char * argv[])
{
//创建套接字
printf("服务器\n");
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0){
ERR_MSG("socket");
return -1;
}
printf("套接字创建成功\n");
//设置允许广播
int brockcast = 1;
if((setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&brockcast,sizeof(brockcast))) < 0){
ERR_MSG("setsockopt");
return -1;
}
//绑定bind
struct sockaddr_in sin;
sin.sin_family = AF_INET; //族需要相同
sin.sin_port = htons(PORT); //端口转变成点分十进制
sin.sin_addr.s_addr = inet_addr(IP); //地址转成网络字节序
socklen_t len = sizeof(sin);
struct sockaddr_in cin;
socklen_t len1 = sizeof(cin);
char buf[128] = "";
char str[128] = "";
int res = 0;
while(1){
//传递
memset(str,0,sizeof(str));
printf("请输入:\n");
scanf("%s",str);
res = sendto(sfd,str,sizeof(str),0,(struct sockaddr*)&sin,len);
if(res < 0){
ERR_MSG("sendto");
}
}
return 0;
}
客户端
#include <head.h>
#include <head.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"line: %d\n",__LINE__);\
perror(msg);\
return -1;\
}while(0);
#define IP "192.168.74.255"
#define PORT 1562
int main(int argc,const char * argv[])
{
//创建报式套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd < 0){
ERR_MSG("socket");
}
printf("sfd = %d\n",sfd);
//设置允许广播
int brockcast = 1;
if((setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&brockcast,sizeof(brockcast))) < 0){
ERR_MSG("setsockopt");
return -1;
}
//填充地址信息结构体
//真实的地址信息结构体根据地址组指定
struct sockaddr_in sin;
sin.sin_family = AF_INET; //族必须是和sdf的族一致
sin.sin_port = htons(PORT); //端口号
sin.sin_addr.s_addr = inet_addr(IP); //IP地址
socklen_t len1 = sizeof(sin);
//创造一个新的接口
struct sockaddr_in cin;
socklen_t len = sizeof(cin);
if((bind(sfd,(struct sockaddr*)&sin,len)) > 0 ){
ERR_MSG("bind");
return -1;
}
printf("绑定bind成功\n");
int res = 0;
char buf[128] = "";
char str[128] = "";
while(1){
//接收
memset(buf,0,sizeof(buf));
res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&len1);
if(res < 0){
ERR_MSG("recvfrom");
}
printf("recvfrom :%s\n",buf);
if( 0 == strcmp(str,"quit")){
break;
}
printf("[%s : %d] : %s\n", \
inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
}
close(sfd);
return 0;
}