1.编写机械臂简易客户端
cpp
#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客户端实现
cpp
#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);
//发送ack
sendto(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;
}