1.广播
1.1广播发送端模型(类似UDP客户端)
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//将套接字设置成允许广播int broadcast=1;if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1)//套接字描述符,套接字要设置的层(应用层)、指定层内属性(允许广播)//设置该属性容器起始地址,参数4的大小{perror("setsockopt error");return -1;}//绑定,非必要//填充接收端地址信息结构体struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(6789);cin.sin_addr.s_addr=inet_addr("192.168.125.255");//发送消息char sbuf[128]="";while(1){printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//发送到广播地址sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,sizeof(cin));printf("发送成功\n");}//关闭套接字close(sfd);return 0;
}
1.2广播接收端模型(类似UDP服务器端)
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}//填充地址信息结构体struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(6789);rin.sin_addr.s_addr=inet_addr("192.168.125.255");//绑定if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}//接收信息char rbuf[128]="";while(1){//清空数组bzero(rbuf,sizeof(rbuf));//接受信息recvfrom(rfd,rbuf,sizeof(rbuf),0,0,0);printf("收到消息:%s\n",rbuf);}//关闭套接字close(rfd);return 0;
}
运行结果:
2. 组播
2.1组播发送端模型(类型UDP客户端)
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}//绑定非必要//填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(9999);sin.sin_addr.s_addr=inet_addr("224.1.2.3");//发送消息char sbuf[128]="";while(1){printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;sendto(rfd,sbuf,strlen(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("发送成功\n");}close(rfd);return 0;
}
2.2组播接收端模型(类似UDP服务器端)
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}printf("rfd=%d\n",rfd);//设置加入多播族struct ip_mreqn imr;imr.imr_multiaddr.s_addr=inet_addr("224.1.2.3");imr.imr_address.s_addr=inet_addr("192.168.125.227");imr.imr_ifindex=2;//网卡编号if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1){perror("setsockopt error");return -1;}printf("加入组播成功\n");//填充地址信息结构体struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(9999);rin.sin_addr.s_addr=inet_addr("224.1.2.3");if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));recv(rfd,rbuf,sizeof(rbuf),0);printf("收到:%s\n",rbuf);}close(rfd);return 0;
}
运行结果:
3.流式域套接字
3.1流式域套接字服务器端
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//判断套接字文件存在,存在删除if(access("./mysocket",F_OK)==0){//存在删除if(unlink("./mysocket")==-1){perror("unlink error");return -1;}}//2.绑定套接字文件//2.1填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;//字符串不能用赋值运算符赋值strcpy(sun.sun_path,"./mysocket");//2.2绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//3.监听if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.阻塞等待客户端连接请求//定义容器接收客户端地址信息struct sockaddr_un cun;socklen_t socklen=sizeof(cun);int newfd=-1;if((newfd=accept(sfd,(struct sockaddr*)&cun,&socklen))==-1){perror("accept error");return -1;}printf("有新客户发来连接请求\n");//5.数据收发char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int res=recv(newfd,rbuf,sizeof(rbuf),0);if(res==0){printf("客户端已下线\n");break;}printf("[%s]:%s\n",cun.sun_path,rbuf);//连接一个笑脸回复strcat(rbuf,"*_*");//发送回去send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}close(sfd);close(newfd);return 0;
}
3.2流式域套接字客户端
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{//1.创建用于通信的套接字文件描述符int cfd=socket(AF_UNIX,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//判断套接字文件是否存在,如果存在删除if(access("./mysocket1",F_OK)==0){//存在删除if(unlink("./mysocket1")==-1){perror("unlink error");return -1;}}//2.绑定(不绑定,系统不会绑定)//2.1填充地址信息结构体struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./mysocket1");//2.2绑定if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind error");return -1;}printf("bind success\n");//3.连接服务器//3.1填充要连接的服务器地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./mysocket");//3.2连接服务器if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("connect error");return -1;}printf("connect success\n");//4.数据收发char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;//将数据发送给服务器send(cfd,wbuf,strlen(wbuf),0);printf("发送成功\n");//判断发送的数据if(strcmp(wbuf,"quit")==0){break;}//接收服务器发来的消息//清空数据bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到消息:%s\n",wbuf);}close(cfd);return 0;
}
运行结果:
4.报式域套接字
4.1报式域套接字服务器端
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建套接字int sfd=socket(AF_UNIX,SOCK_DGRAM,0);//SOCK_DGRAM使用UDP报式套接字通信if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//域套接字绑定函数,只能绑定一个不存在的套接字文件//绑定前判断当前文件是否存在if(access("./linux",F_OK)==0){//文件存在删除if(unlink("./linux")==-1){perror("unlink error");return -1;}}//绑定//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}//数据收发char buf[128]="";//定义变量存放客户端地址信息结构体struct sockaddr_un cun;socklen_t socklen=sizeof(cun);while(1){//清空数组bzero(buf,sizeof(buf));//从套接字文件读取消息recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,&socklen);printf("[%s]:%s\n",cun.sun_path,buf);//将字符串连接后回发strcat(buf,"*_*");//if(write(sfd,buf,sizeof(buf))==-1)if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("write error");return -1;}printf("发送成功\n");}//关闭套接字close(sfd);return 0;
}
4.2报式域套接字客户端
程序代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建用于通信的套接字文件描述符int cfd=socket(AF_UNIX,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}//域套接字绑定函数,只能绑定一个不存在的套接字文件//绑定前,判断当前文件是否存在if(access("./unix",F_OK)==0){//文件存在,删除if(unlink("./unix")==-1){perror("unlink error");return -1;}}//绑定//填充地址信息结构体struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./unix");//绑定if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind error");return -1;}//填充服务器的地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//数据收发char buf[128]="";while(1){printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//发送给服务器sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sun,sizeof(sun));if(strcmp(buf,"quit")==0)break;//接收服务器发来的消息recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);printf("收到消息:%s\n",buf);}//关闭套接字close(cfd);return 0;
}
运行结果:
流程图: