本文主要是介绍1.16 day3 IO网络编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
用udp实现tftp下载功能
#include <myhead.h>
#define PORT 69
#define IP "192.168.122.24"
int xiazai(int sfd,struct sockaddr_in sin,int fd,socklen_t socklen)
{char buf[516]="";char ack[4];short *p1=(short *)buf;*p1=htons(1);char *p2=buf+2;strcpy(p2,"helltaker.bmp");char *p3=p2+strlen(p2)+1;strcpy(p3,"octet");int len=4+strlen(p2)+strlen(p3);sendto(sfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));while(1){bzero(buf,sizeof(buf));int res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);if(res<516){write(fd,buf+4,res-4);break;}write(fd,buf+4,res-4);short *q1=(short *)(buf+2);short *p4=(short *)ack;*p4=htons(4);short *p5=(short *)(ack+2);*p5=*q1;sendto(sfd,ack,4,0,(struct sockaddr*)&sin,sizeof(sin));}printf("下载完成\n");return 0;}
int main(int argc, const char *argv[])
{int fd=-1;if((fd=open("./helltaker.bmp",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("open error");return -1;}int sfd=-1;if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}int reuse=-1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);socklen_t socklen=sizeof(sin);int num;while(1){printf("\t\t=======1.下载=======\n");printf("\t\t=======2.上传=======\n");printf("\t\t=======3.退出=======\n");printf("请输入功能:");scanf("%d",&num);while(getchar()!='\n');switch(num){case 1:{xiazai(sfd,sin,fd,socklen);}break;case 2:{//shangchuan();}break;case 3 :
goto END;default:printf("输入有误,请重新输入\n");}printf("按任意键清屏\n");while(getchar()!='\n');system("clear");}
END:return 0;
}
这篇关于1.16 day3 IO网络编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!