8.18作业
1.基于UDP的TFTP文件传输
#include <25061head.h>
#define SER_IP "192.168.108.192"
#define SER_PORT 69
#define CLI_IP "192.168.109.126"
#define CLI_PORT 9999int main(int argc, const char *argv[])
{int cfd=socket(AF_INET,SOCK_DGRAM,0);if(-1==cfd){ERR_MSG("socket error");}printf("socket success cfd=%d\n",cfd);struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){ERR_MSG("bind error");}printf("bind success\n");struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);socklen_t addrlen=sizeof(sin);char msgbuf[516]="";char filename[256]="";printf("请输入下载的文件名:");scanf("%s",filename);short *p1=msgbuf;*p1=htons(1);char *p2=msgbuf+2;strcpy(p2,filename);char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");int msglen=2+strlen(p2)+strlen(p4)+2;if(-1==sendto(cfd,msgbuf,msglen,0,(struct sockaddr*)&sin,sizeof(sin))){close(cfd);ERR_MSG("sendto error");}int fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd==-1){close(cfd);ERR_MSG("open error");}struct sockaddr_in addr;socklen_t len=sizeof(addr);unsigned short block=0;int res;short opcode;while(1){res=recvfrom(cfd,msgbuf,sizeof(msgbuf),0,(struct sockaddr*)&addr,&len);if(-1==res){close(fd);close(cfd);ERR_MSG("recvfrom error");}opcode=ntohs(*(short*)msgbuf);if(opcode==3){unsigned short block_num=ntohs(*(unsigned short*)(msgbuf+2));if(block_num==block+1){block=block_num;int datalen=res-4;ssize_t w=write(fd,msgbuf+4,datalen);if(w<0){close(fd);close(cfd);ERR_MSG("write error");return -1;}*(short*)msgbuf=htons(4);*(unsigned short*)(msgbuf+2)=htons(block);if(sendto(cfd,msgbuf,4,0,(struct sockaddr*)&addr,len)==-1){close(fd);close(cfd);ERR_MSG("sendto error");return -1;}if(datalen<512){printf("下载完成\n");close(fd);return 0;}}else if(block_num==block){*(short*)msgbuf=htons(4);*(unsigned short*)(msgbuf+2)=htons(block);if(-1==sendto(cfd,msgbuf,4,0,(struct sockaddr*)&addr,len)){close(fd);close(cfd);ERR_MSG("sendto error");return -1;}}else{printf("error\n");}}else if(opcode==5){unsigned short error_code=ntohs(*(unsigned short*)(msgbuf+2));char *error_msg=msgbuf+4;printf("错误:%d-%s\n",error_code,error_msg);close(fd);close(cfd);return -1;}else{printf("未知:%d\n",opcode);close(fd);close(cfd);return -1;}}close(cfd);return 0;
}
2.