网编.hw.9.10
云盘下载
#include <myhead.h>
#define SER_IP "192.168.108.93"
#define SER_PORT 69
#define addr "192.168.109.6"
#define port 8888/******************主程序******************/
int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}/*2、绑定ip和端口号(可选)struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_addr.s_addr = inet_addr(CLI_IP);cin.sin_port = htons(CLI_PORT);if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin))==-1){perror("bind error");return -1;}*///3、数据收发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] = "";//组装协议//1、组装操作码,下载请求的操作码为1short *p1 = (short *)msgbuf;*p1 = htons(1); //网络字节序,因为是2字节无符号整数//2、将要下载的文件名放入char filename[20] = "";printf("请输入要下载的文件名:");fgets(filename, sizeof(filename), stdin);filename[strlen(filename)-1] = 0;//封装到协议中char *p2 = msgbuf+2; //跳过前两个字节strcpy(p2, filename);//3、将传输模式放入协议中char *p4 = p2+strlen(p2)+1;strcpy(p4, "octet");int size = 2+strlen(p2)+strlen(p4)+2;//将请求数据包发送给服务器sendto(cfd, msgbuf, size, 0, (struct sockaddr*)&sin, sizeof(sin)); //以只写的形式打开一个名为filename的文件int fd=-1;if((fd=open(filename,O_CREAT|O_WRONLY,0664))==-1){perror("open error");return -1;}while(1){//通过recvfrom接受服务器传来的消息包int len;if((len=recvfrom(cfd,msgbuf,sizeof(msgbuf),0,(struct sockaddr*)&sin,&addrlen))==-1){perror("recvfrom error");return -1;}//解析传来的消息报中的前两字节short x=ntohs(*(short*)msgbuf);//判断如果前两字节的值为5,说明传过来的是错误消息包if(x==5){printf("[error-%d]:%s\n",ntohs(*(msgbuf+2)),msgbuf+4);}//如果前两字节的值为3,则说明传来的是数据信息else if(x==3){//判断消息包的四个字节后的数据长度是否为512//如果是将消息包的4个字节后的数据,写入到文件中if(len==516){write(fd,msgbuf+4,512);//并回复一个:确认包//判断消息包的4字节后的数据长度是否为512,如果是//将消息包的4字节后的数据,写入到文件中//并且回复一个4字节确认包short *p = (short *)msgbuf;*p = htons(4);sendto(cfd, msgbuf, 4, 0, (struct sockaddr*)&sin, sizeof(sin)); }//如果消息包的4字节后的长度为小于512if(len<516){//将最后的数据写入到文件中,回复一个确认包,结束循环write(fd,msgbuf+4,len-4);short *p=(short *)msgbuf;*p=htons(4);sendto(cfd,msgbuf,4,0,(struct sockaddr*)&sin,sizeof(sin));printf("文件下载完成\n");break;}}}//4、关闭套接字close(cfd);close(fd);return 0;
}
机械臂
#include <myhead.h>
#define dis_port 8888
#define dis_addr "192.168.108.93"
#define port 7776
#define addr "192.168.109.6"
int main(int argc, const char *argv[])
{//1.socketint cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}//2.绑定ip地址struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(port);cin.sin_port=inet_addr(addr);if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("bind success..\n");//3.connect组装对端信息地址结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(dis_port);sin.sin_addr.s_addr=inet_addr(dis_addr);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success..\n");//设置机械臂初始状态char rbuf[5]={0xff,0x02,0x00,0x00,0xff};unsigned char bbuf[5]={0xff,0x02,0x01,0x00,0xff};send(cfd,rbuf,sizeof(rbuf),0);send(cfd,bbuf,sizeof(bbuf),0);//4.read/writechar buf[128]="";int x;while(1){printf("输入要操作的机械臂[红0/蓝1]:");scanf("%d",&x);if(x==0){while(1){int a;printf("输入移动的角度:");scanf("%d",&x);if(x==999)break;rbuf[3]+=x;send(cfd,rbuf,sizeof(rbuf),0);}}else if(x==1){while(1){ int a;printf("输入移动的角度:");scanf("%d",&x);if(x==999)break;bbuf[3]+=x;send(cfd,bbuf,sizeof(bbuf),0);}}else{printf("输入的数字有误..\n");break;}}close(cfd);return 0;
}