网络编程学习

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;
}
相关推荐
gjf05_05几秒前
人该怎样活着呢?版本75.8
学习
深圳市快瞳科技有限公司30 分钟前
宠物门禁端侧AI落地解析:画质检测、活体甄别与离线推理
网络
li星野1 小时前
【学习记录】PCB与PCBA核心知识全解析:从设计到制造的关键细节
学习·制造
Hum8le2 小时前
漏洞知识点《php伪协议》
开发语言·安全·web安全·php
卿卿的产品经理日记2 小时前
【AI产品经理实战】Day 35|从“沉迷工具“到回归 AI 底层:Skill 收官、系统复盘与下一个 13 天
人工智能·学习·产品经理
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
m0_715674433 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
大数据·网络·人工智能·网络安全
HY小宝F3 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
dog2504 小时前
带宽,时延,抖动的不可能三角
网络·tcp/ip
砚凝霜4 小时前
【软考信息安全】第十六章 网络安全风险评估过程与技术方法
网络·安全·web安全