2024.3.1 网络编程

news2024/12/24 9:05:53

1.思维导图

2.TCP机械臂测试

程序代码:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服务器端IP
#define SER_PORT 8888                   //服务器端端口号
 
#define CLI_IP "192.168.199.131"        //客户端IP
#define CLI_PORT 9999                   //客户端端口号
/**********************TCP客户端********************/
int main(int argc, const char *argv[])
{
	//1.创建用于通信的套接字
	int cfd=-1;
	if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){
		perror("socket error");
		return -1;
	}
	printf("cfd=%d\n",cfd);
	//2.绑定服务器IP地址和端口号(非必须)
	//2.1填充地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(CLI_PORT);
	cin.sin_addr.s_addr=inet_addr(CLI_IP);
 
	//2.2绑定
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){
		perror("bind error");
	}
	printf("bind success\n");
 
	//3.连接服务器
	//3.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);
 
	//3.2连接到服务器
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
		perror("connect error");
		return -1;
	}
 
	//4.进行数据的收发操作
	char rbuf[5]={0xff,0x02,0x00,0x00,0xff};    //红色机械臂
	unsigned char bbuf[5]={0xff,0x02,0x01,0x00,0xff};    //蓝色机械臂
	
	//发送给服务器当做初始值
	send(cfd,rbuf,sizeof(rbuf),0);
	sleep(1);                           //防止沾包
	send(cfd,bbuf,sizeof(bbuf),0);
 
	char key=0;     //定义键盘输入的值
	while(1)
	{
		scanf("%c",&key);      
		getchar();             //吸收垃圾字符
 
		switch(key)
		{
			case 'W':
			case 'w':
				{
					rbuf[3]+=3;        //红色机械臂每次增加3度
					if(rbuf[3]>=90){
						rbuf[3]=90;
					}
					send(cfd,rbuf,sizeof(rbuf),0);   //将键盘控制的结果发送到服务器端
				}
				break;
			case 'S':
			case 's':
				{
					rbuf[3]-=3;         //红色机械臂每次减少3度
					if(rbuf[3]<=-90){
						rbuf[3]=-90;
					}
					send(cfd,rbuf,sizeof(rbuf),0);
				}
				break;
			case 'D':
			case 'd':
				{
					bbuf[3]+=3;        //蓝色机械臂每次增加3度
					if(bbuf[3]>=180){
						bbuf[3]=180;
					}
					send(cfd,bbuf,sizeof(bbuf),0);
				}
				break;
			case 'A':
			case 'a':
				{
					bbuf[3]+=3;        //蓝色机械臂每次减少3度
					if(bbuf[3]<=0){
						bbuf[3]=0;
					}
					send(cfd,bbuf,sizeof(bbuf),0);
				}
				break;
			default:printf("error\n");break;
		}
	}
 
	//5.关闭套接字
	close(cfd);
	return 0;
}

3.基于UDP的TFTP文件传输

程序代码:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服务端IP
#define SER_PORE 69                     //TFTP协议使用的端口号
 
//定义下载请求
int download(int cfd,struct sockaddr_in sin)
{
		
	//组件协议包:下载请求
	char pack[516]="";
	short *p1=(short *)pack;
	*p1=htons(1);          //设置操作码
 
	char file[20]="";
	printf("请输入文件名:");
	fgets(file,sizeof(file),stdin);
	file[strlen(file)-1]=0;   
 
	char *p2=(pack+2);
	strcpy(p2,file);   //文件名
 
	char *p4=p2+strlen(p2)+1;
	strcpy(p4,"octet");        //模式位
 
	int packlen=4+strlen(p2)+strlen(p4);  //请求包大小
	printf("%d\n",packlen);
 
	//向服务器发送请求包
	sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin));
 
	//以只写的形式打开文件
	int wfd=-1;
	if((wfd=open(file,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){
		perror("open error");
		return -1;
	}
	int res=0;
 
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
 
	while(1)
	{
		//收取服务器发来的数据包
		//判断数据包的操作码是否为3 以及 数据包数据内容是否为512字节
		//若为512字节,则读取后,回复一个应答包,继续接收下一个
		//如果小于512,则读取数据后,回复一个应答包,结束接收数据
 
		//清空协议包
		bzero(pack,sizeof(pack));
		
		res=recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,&socklen); //接收数据包
		
		if(*p1==ntohs(3))         //数据包
		{
			write(wfd,pack+4,res-4);
			//回复应答包
			*p1=htons(4);
			sendto(cfd,pack,4,0,(struct sockaddr*)&cin,sizeof(cin));
 
			if(res-4<512){
				printf("下载完成\n");
				break;
			}
		}else if(*p1==ntohs(5))      //错误包
		{
			printf("error\n");
			return -1;
		}
	}
	close(wfd);
	return 0;
}
 
//定义上传函数
int upload(int cfd,struct sockaddr_in sin)
{
	//组件协议包:上传请求
	char pack[516]="";
	unsigned short *p1=(unsigned short *)pack;
	*p1=htons(2);          //设置操作码
 
	char file[20]="";
	printf("请输入文件名:");
	fgets(file,sizeof(file),stdin);
	file[strlen(file)-1]=0;   
 
	char *p2=(pack+2);
	strcpy(p2,file);   //文件名
 
	char *p4=p2+strlen(p2)+1;
	strcpy(p4,"octet");        //模式位
 
	int packlen=4+strlen(p2)+strlen(p4);  //请求包大小
	printf("%d\n",packlen);
 
	//向服务器发送请求包
	sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin));
 
	//以只读的形式打开文件
	int rfd=-1;
	if((rfd=open(file,O_RDONLY,0664))==-1){
		perror("open error");
		return -1;
	}
	int res=0;
 
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
 
	unsigned short num=0;         //定义块编号;
	while(1)
	{
		
		//清空协议包
		bzero(pack,sizeof(pack));
 
		res=recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,&socklen);
		
		if(*p1==ntohs(4))         //接收应答包
		{
			//发送数据包
			*p1=htons(3);
 
			//填充块编号
			num++;
			*(p1+1)=htons(num);
			//读取数据
			res=read(rfd,p1+2,512);
			sendto(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,sizeof(cin));
			if(res==0){
				printf("上传完成\n");
				break;
			}else if(res<0){
				printf("error\n");
				return -1;
			}
		}else if(*p1==ntohs(5))      //错误包
		{
			printf("error\n");
			return -1;
		}
	}
	close(rfd);
	return 0;
}
 
 
/*******************UDP客户端********************/
int main(int argc, const char *argv[])
{
	/*
	//判断是否外部传参
	if(argc!=2){
	printf("unknow filename\n");
	return -1;
	}
	*/
	//1.创建用于通信的套接字文件描述符
	int cfd=-1;
	if((cfd=socket(AF_INET,SOCK_DGRAM,0))==-1){
		perror("socket error");
		return -1;
	}
	//2.进行数据的收发
 
	//填充服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORE);
	sin.sin_addr.s_addr=inet_addr(SER_IP);
 
	//创建小菜单
	int menu=0;
	while(1)
	{
		system("clear");              //执行终端指令
 
		printf("\t*********1.下载********\t\n");
		printf("\t*********2.上传********\t\n");
		printf("\t*********3.退出********\t\n");
		printf("请输入选项:");
		scanf("%d",&menu);
		getchar();
 
		switch(menu)
		{
		case 1:
			{
				//下载请求
				download(cfd,sin);				
			}
			break;
		case 2:
			{
				//上传请求
				upload(cfd,sin);
			}
			break;
		case 3:
			{
				//退出
				goto END;
 
			}
			break;
		default:printf("error\n");break;
		}
	}
 
END:
	//3.关闭套接字
	close(cfd);
 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1487177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一二三文档管理系统整体介绍

系统简介 企事业单位一站式文档管理系统&#xff0c;让组织内文档管理有序&#xff0c;协作高效、安全可控。 本应用完全开源&#xff0c;开源协议为MIT。 本应用基于一二三应用开发平台构建&#xff0c;该平台完全开源&#xff0c;开源协议为MIT&#xff0c;传送门。 系统特…

VMware 虚拟机安装windows 10操作系统

先提前准备好镜像文件 1.创建新的虚拟机 2.选择自定义&#xff0c;然后下一步 v Windows 建议选择2G以上&#xff0c;下一步 选择网络地址转换&#xff08;NAT&#xff09;&#xff0c;下一步 这里可按自己的需求来分区&#xff0c;也可以安装好后再分区 选择立即重启&#xff…

【心理】程序人生之情绪与压力篇,附心理学相关证书备考指南(心理学312统考,心理治疗师,中科院心理咨询师,家庭教育指导师,企业培训证书)

程序员生活指南&#xff08;情绪与压力篇&#xff09;之 【心理】程序人生之情绪与压力专项&#xff0c;附心理学相关证书备考指南&#xff08;心理学312统考&#xff0c;心理治疗师&#xff0c;中科院心理咨询师&#xff0c;家庭教育指导师&#xff0c;企业培训证书&#xff0…

3.3日学习打卡----初学Redis(一)

3.3日学习打卡 目录&#xff1a; 3.3日学习打卡NoSQL为什么要用NoSQL什么是NoSQL?NoSQL的四大分类关系型数据库和非关系型数据及其区别NoSQL经典应用 RedisRedis是什么?Linux下安装RedisDocker下安装Redis基本知识 NoSQL 为什么要用NoSQL 单机Mysql的美好年代 在90年代&…

【排序】基于快速选择算法的快排实现

目录 一、常用排序算法比较 二、快速选择算法 快速选择 图解快速选择 三、代码实现 一、常用排序算法比较 排序 时间复杂度 空间复杂度 稳定性 插入排序 O(n) O(1) 稳定 希尔排序 O(nlogn)-O(n)取决于增量序列 O(1) 不稳定 选择排序 O(n) O(1) 不稳定 冒泡…

0.8秒一张图40hx矿卡stable diffusion webui 高质极速出图组合(24.3.3)

新消息是。经过三个月的等待&#xff0c;SD Webui (automatic1111)终于推出了新版本1.8.0&#xff0c;本次版本最大的更新&#xff0c;可能就是pytorch更新到2.1.2, 不过还是晚了pytorch 2.2.2版。 不过这版的一些更新&#xff0c;在forget分支上早就实现了&#xff0c;所以。…

Get Your Back Covered! Coverage, CodeCov和Tox

1. Coverage - 衡量测试的覆盖率 我们已经掌握了如何进行单元测试。接下来,一个很自然的问题浮现出来,我们如何知道单元测试的质量呢?这就提出了测试覆盖率的概念。覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分已被测试过,哪些没有。 coverage.py …

市场复盘总结 20240301

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 40% 最常用的…

dubbo 与 zk 小结

zk官方注册中心&#xff08;mulicast zk nacos redis&#xff09; reference 远程调用 消费者 从zookeeper获取 访问url 注册中心挂了&#xff0c;服务正常访问&#xff1a; 消费者第一次调用将提供方缓存到本地&#xff0c;调用不再访问注册中心 提供者地址改变&#xff0c;…

金南瓜通讯--SECS/GEM程式配方管理recipe是什么

配方在SECS里面成为PPID&#xff0c;叫成recipe 配方有什么用&#xff1f; 设备在针对每款产品&#xff0c;都需要不同的加工工艺&#xff0c;这个加工工艺参数统称配方recipe SECS/GEM对配方描述是什么&#xff1f; process program --- process program is the pre-plann…

猴子吃桃问题(python版)

文章预览&#xff1a; 题目python解法一&#xff1a;运行结果 python解法二&#xff1a;运行结果 python解法三&#xff1a;运行结果 题目 猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早…

04-prometheus服务的动态发现

一、概述 目前&#xff0c;我们每增加一个被监控的节点&#xff0c;就需要修改prometheus的配置文件&#xff0c;然后重新加载prometheus服务&#xff0c;这种方式比较繁琐&#xff0c;每次新增、删除被监控节点都需要重新操作一遍&#xff0c;不适合生产环境的大规模监控架构&…

回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测&#xff08;完整…

yolov5训练太慢的解决方案

问题原因 训练太慢大多是因为没有安装CUDA和pytorch&#xff0c;导致的只有cpu在跑&#xff0c;显卡没跑 这就是很典型的。 解决方案 第一步&#xff1a;安装CUDA 在本机上面安装CUDA,记住只有N卡可以安装&#xff0c;一开始的电脑是自带CUDA的。 如果不是自带的CUDA&…

MATLAB知识点:for循环的七道经典例题

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 &#xff08;…

贪心的一些题目

题目1&#xff1a;分班 5478. 分班 - AcWing题库 解题 #include<iostream> #include<algorithm> using namespace std; const int N100010; int n,k,l; int a[N]; int main() {scanf("%d%d%d",&n,&k,&l);int mn*k;for(int i1;i<m;i) sc…

opencv实现图像的融合

实现图像的融合并且输出一张jpg格式的照片。 先显示一个彩色图的照片 然后我以彩色方式读取1.png&#xff0c;以灰度图方式读取3.png这张图片&#xff0c;并且用两个窗口独立地去显示(我后来发现不能把灰度图和彩色图相融合) 然后实现两个融合 #include <opencv2/highgu…

使用Matplotlib绘制圆环图

圆环图是饼图的修改版&#xff0c;中间区域被切掉。圆环图更关注使用弧的面积来以最有效的方式表示信息&#xff0c;而不是饼图&#xff0c;饼图更关注比较切片之间的比例面积。圆环图在空间方面更有效&#xff0c;因为圆环图内部的空白空间可用于显示有关圆环图的一些附加信息…

黑科技工具盒源码 好用的手机工具盒iAPP源码

全新推出&#xff01;多功能工具箱&#xff1a;一款实用的手机工具集&#xff0c;提供丰富的免费小工具&#xff0c;操作简便。目前包含六项黑科技功能&#xff0c;分别为QQ云端、短信测压、Q绑查询、照妖镜、chatgpt、网页一键打包APP。工具箱体积小巧&#xff0c;不占内存&am…

自建Web视频会议,视频互动,SFU/MCU融合架构选型方案分析

网络越来越好&#xff0c;大家已经越来越多接受在家在线办公&#xff0c;在线工作越来越离不开视频会议&#xff0c;视频互动&#xff0c;当然云平台很多&#xff0c;但也用不同的需求&#xff0c;很多需要自建平台与自已的业务系统集成对接。因为大家业务系统多是b/s架构。一般…