思维导图
广播通信模型
#include <myhead.h>
int main(int argc, char const *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.123.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;
}
#include <myhead.h>
int main(int argc, char const *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){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.123.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));}close(sfd);return 0;
}
组播通信模型
#include <myhead.h>
int main(int argc, char const *argv[])
{int rfd =socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}struct ip_mreqn im;im.imr_multiaddr.s_addr=inet_addr("224.1.2.3");im.imr_address.s_addr=inet_addr("192.168.122.60");im.imr_ifindex=2; if((setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&im,sizeof(im)))==-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));recvfrom(rfd,rbuf,sizeof(rbuf),0,0,0);printf("收到消息为:%s\n",rbuf);}close(rfd);return 0;
}
#include <myhead.h>
int main(int argc, char const *argv[])
{int sfd =socket(AF_INET,SOCK_DGRAM,0);if(sfd==-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(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("发送成功\n");}close(sfd);return 0;
}
流式域套接字模型
#include <myhead.h>
int main(int argc, char const *argv[])
{int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}if(access("./unix",F_OK)==0){if(unlink("./unix")==-1){perror("unlink error");return -1;}}struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");if((bind(sfd,(struct sockaddr*)&sun,sizeof(sun)))==-1){perror("bind error");return -1;}puts("bind success");if(listen(sfd,128)==-1){perror("listen error");return -1;}struct sockaddr_un cun;socklen_t socklen=sizeof(cun);int newfd=accept(sfd,(struct sockaddr*)&cun,&socklen);if(newfd==-1){perror("accept error");return -1;}char buf[128]="";while(1){bzero(buf,sizeof(buf));int res=recv(newfd,buf,sizeof(buf),0);if(res==0){printf("客户端已经下线\n");}printf("[%s]:%s\n",cun.sun_path,buf);}close(newfd);close(sfd);return 0;
}
#include <myhead.h>int main(int argc, const char *argv[])
{int cfd = socket(AF_UNIX,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);if(access("./linux",F_OK)==0){if(unlink("./lunix")==-1){perror("unlink error");return -1;} }struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./lunix");if((bind(cfd,(struct sockaddr*)&cun,sizeof(cun)))==-1){perror("bind error");return -1;} puts("bind success");struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("connect error");return -1;}printf("链接成功\n");char buf[128]="";while(1){bzero(buf,sizeof(buf));printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;send(cfd,buf,sizeof(buf),0);printf("发送成功\n");if(strcmp(buf,"quit")==0){break;}}close(cfd);return 0;
}
报式域套接字模型
#include <myhead.h>
#define SER_PORT 9999
#define SER_IP "192.168.122.36"int main(int argc, char const *argv[])
{int sfd=socket(AF_UNIX,SOCK_DGRAM,0);if(sfd==-1){perror("");return -1;}printf("sfd=%d\n",sfd);if(access("./linux",F_OK)==0){if(unlink("./lunix")==-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\n",buf);strcat(buf,"=-=");if((sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cun,sizeof(cun)))==-1){perror("sendto error");return -1;}}close(sfd);return 0;
}
#include <myhead.h>
int main(int argc, char const *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,0,0);printf("收到消息为:%s\n",buf);}return 0;
}
作业:编写一个客户端,通过TFTP服务器实现文件的上传和下载
#include<myhead.h>
#define SER_PORT 69
#define SER_IP "192.168.122.71"int do_download(int cfd,struct sockaddr_in sin)
{char buf[516] = "";short *p1 = (short *)buf;*p1 = htons(1);char *p2 = buf+2;char filename[20]="";printf("请输入要下载的文件名>>>");scanf("%s",filename);getchar(); strcpy(p2, filename);char *p3 = p2+strlen(p2)+1;strcpy(p3, "octet");int len = 4+strlen(p2) + strlen(p3); if((sendto(cfd, buf, len, 0, (struct sockaddr*)&sin, sizeof(sin)))==-1){perror("sendto error");return -1;}printf("下载请求已发送\n");socklen_t addrlen = sizeof(sin);int fd = -1;int res=0;unsigned short b_id = 0;char ack[4]="";while(1){bzero(buf,sizeof(buf));if((res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen))==-1){perror("recv error");break;}b_id=ntohs(*(short *)(buf+2));if(buf[1]==3){if((fd=open(filename,O_WRONLY|O_CREAT|O_APPEND,0664))==-1){perror("open error");return -1;}if(write(fd,buf+4,res-4)==-1){perror("write all");break;}bzero(ack,sizeof(ack));*(short*)ack=htons(4);*(short *)(ack + 2) = htons(b_id);if((sendto(cfd,ack,4,0,(struct sockaddr*)&sin,sizeof(sin)))==-1){perror("sendto error");break;}if(res <516 ){puts("下载完成");break;}}if(buf[1]==5){puts("error num");break;}}close(fd);return 0;
}int do_upload(int cfd,struct sockaddr_in sin)
{char buf[516] = "";short *p1 = (short *)buf;*p1 = htons(2);char *p2 = buf+2;char filename[20]="";printf("请输入要上传的文件名>>>");scanf("%s",filename);getchar(); strcpy(p2, filename);if(access(filename,F_OK)==-1){perror("文件不存在");return -1;}char *p3 = p2+strlen(p2)+1;strcpy(p3, "octet");int len = 4+strlen(p2) + strlen(p3); if((sendto(cfd, buf, len, 0, (struct sockaddr*)&sin, sizeof(sin)))==-1){perror("sendto error");return -1;}printf("上传请求已发送\n");socklen_t addrlen = sizeof(sin);int fd = -1;int res=0;unsigned short b_id = 0;char ack[4]="";while(1){bzero(ack,sizeof(ack));if((recvfrom(cfd,ack,sizeof(ack),0,(struct sockaddr*)&sin,&addrlen))==-1){perror("recv error");break;}printf("收到的前四个字节为:[%d%d%d%d]\n",ack[0],ack[1],ack[2],ack[3]);b_id=ntohs(*(short *)(ack+2));printf("b_id=%d\n",b_id);if(ack[1]==4){puts("11");fd=open(filename,O_RDONLY);printf("fd=%d\n",fd);if(fd==-1){perror("open error");break;}puts("aa");res=read(fd,buf+4,512);printf("res=%d\n",res);if(res==-1){perror("read error");break;}puts("bb");bzero(buf,sizeof(buf));*(short*)buf=htons(3);*(short *)(buf + 2) = htons(b_id+1);if(sendto(cfd,buf,res+4,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");break;}puts("cc");if(res<512){puts("上传成功");break;}}if(buf[1]==5){puts("error num");char *err_id=(buf+3);printf("errid=%d\n",*err_id);break;}}close(fd);return 0;}int main(int argc, const char *argv[])
{int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);char menu;while(1){printf("\t\t====1.download====\n");printf("\t\t====2.upload ====\n");printf("\t\t====0.exit ====\n");printf("Please enter function options:");scanf("%c",&menu);while(getchar() != '\n');switch(menu){case '1': {do_download(cfd,sin); }break;case '2':{do_upload(cfd,sin); }break;case '0':exit(1);default:{printf("enter error!!!");}}printf("Enter any key to clear the screen:");while(getchar() != '\n');system("clear");}close(cfd);return 0;
}