网络编程学习
1.编写机械臂简易客户端
#include<myhead.h>#define SER_IP "192.168.108.153"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-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);socklen_t addrlen=sizeof(sin);//连接服务器if(connect(sfd,(struct sockaddr*)&sin,addrlen)==-1){perror("connect error");return -1;}//初始化机械臂char rbuf[5]={0xff,0x02,0x00,0xa6,0xff};unsigned char bbuf[5]={0xff,0x02,0x01,0xb4,0xff};send(sfd,rbuf,sizeof(rbuf),0);send(sfd,bbuf,sizeof(bbuf),0);printf("按w红色手臂角度增大\n");printf("按s红色手臂角度增大\n");printf("按d蓝色手臂角度增大\n");printf("按a蓝色手臂角度增大\n");printf("按q退出\n");//操控机械臂char c;while(1){c=getchar();switch(c){case 'w':{if(rbuf[3]>=0x5a)break;rbuf[3]+=2;send(sfd,rbuf,sizeof(rbuf),0);break;}case 's':{if(rbuf[3]>=0xa6)break;rbuf[3]-=2;send(sfd,rbuf,sizeof(rbuf),0);break;}case 'd':{if(bbuf[3]>=0xb4)break;bbuf[3]+=2;send(sfd,bbuf,sizeof(bbuf),0);break;}case 'a':{if(bbuf[3]<=0x02&&bbuf[3]!=0x00)bbuf[3]=0x00;else if(bbuf[3]==0x00)break;bbuf[3]-=2;send(sfd,bbuf,sizeof(bbuf),0);break;}case 'q':{rbuf[3]=0xa6;bbuf[3]=0xb4;send(sfd,rbuf,sizeof(rbuf),0);send(sfd,bbuf,sizeof(bbuf),0);close(sfd);return 0;}default :break;}}return 0;
}
2、基于UDP完成tftp客户端实现
#include<myhead.h>#define SER_PORT 69//定义下载文件函数
int my_copy(int sfd,struct sockaddr_in sin,socklen_t addrlen)
{char buf[516]="";char filename[20]="";printf("请输入你要下载的文件名:\n");getchar();fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;//用只写的形式打开一个文件int fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd==-1){perror("open error");return -1;}//确认是下载文件,还是传输文件short *p1=(short *)buf;*p1=htons(1);//要下载或者传输的数据名char *p2=buf+2;strcpy(p2,filename);//填入模式char *p4=p2+strlen(filename)+1;strcpy(p4,"octet");//定义传输大小int size=2+strlen(p2)+strlen(p4)+2;//传输请求sendto(sfd,buf,size,0,(struct sockaddr*)&sin,addrlen);//数据收发while(1){int res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);if(res==-1){perror("recvfrom error");close(sfd);close(fd);return -1;}char *p=buf+4;p1=(short *)buf;//如果发过来的是错误信息if(ntohs(*p1)==5){printf("%s\n",p);close(sfd);close(fd);return -1;}int num=res-4; //文件中可能有\0,所以不能用strlen求读取的大小//写入数据if(num<512){write(fd,p,num);break;}write(fd,p,num);*p1=htons(4);//发送acksendto(sfd,buf,4,0,(struct sockaddr*)&sin,addrlen);}close(fd);printf("下载成功\n");return 0;
}//定义文件传输函数
int my_trans(int sfd,struct sockaddr_in sin,socklen_t addrlen)
{char buf[516]="";char filename[20]="";printf("请输入你要传输的文件名:\n");getchar();fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;//用只写的形式打开一个文件int fd=open(filename,O_RDONLY);if(fd==-1){perror("open error");return -1;}//确认是下载文件,还是传输文件short *p1=(short *)buf;*p1=htons(2);//要下载或者传输的数据名char *p2=buf+2;strcpy(p2,filename);//填入模式char *p4=p2+strlen(filename)+1;strcpy(p4,"octet");//定义传输大小int size=2+strlen(p2)+strlen(p4)+2;//传输请求sendto(sfd,buf,size,0,(struct sockaddr*)&sin,addrlen);int count=1;char rbuf[512]="";int res1=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);if(res1==-1){perror("rescvfrom error");close(sfd);close(fd);return -1;}p1=(short *)buf;//如果接收的是错误信息if(ntohs(*p1)==5){printf("%s\n",buf+4);close(sfd);close(fd);return -1;}char *k2=(char *)buf+2;if(ntohs(*k2)!=0){close(sfd);close(fd);return -1;}//数据收发while(1){bzero(rbuf,0);int res=read(fd,rbuf,sizeof(rbuf));if(res==0)break;else if(res==-1){perror("read error");close(fd);return -1;}*p1=htons(3); //发送包的操作码short *k=(short *)(buf+2);*k=htons(count);char *p=buf+4;memcpy(p,rbuf,res);int size1=2+2+res;//发送数据包sendto(sfd,buf,size1,0,(struct sockaddr*)&sin,addrlen);//接受ack包if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen)==-1){perror("rescvfrom error");close(fd);}//p1=(short *)buf;//如果接收的是错误信息if(ntohs(*p1)==5){printf("%s\n",p);close(fd);return -1;}k=(short *)(buf+2);if(ntohs(*k)!=count){close(fd);return -1;}//count自增count++;}close(fd);printf("下载成功\n");return 0;
}int main(int argc, const char *argv[])
{if(argc!=2){printf("请先输入IP地址:\n");return -1;}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(SER_PORT);sin.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen=sizeof(sin);while(1){printf("1>>>>>>>>>下载文件\n");printf("2>>>>>>>>>传输文件\n");printf("3>>>>>>>>>退出系统\n");int choose;printf("请输入操作:\n");scanf("%d",&choose);switch(choose){case 1:{if(my_copy(sfd,sin,addrlen)==-1)return -1;break;}case 2:{if(my_trans(sfd,sin,addrlen)==-1)return -1;break;}case 3:{close(sfd);return 0;}default :{printf("无效的操作,请重新输入操作\n");break;}}}return 0;
}