2024.3.1 网络编程

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.mfbz.cn/a/427033.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++_数据类型_字符串型

作用 用于表示一串字符 两种风格 C风格字符串&#xff1a;char 变量名[] "字符串值” 示例 注意 C风格的字符串要用双括号括起来 C风格字符串&#xff1a;string 变量名 "字符串值” 注意 用C风格字符串的时候&#xff0c;要包含这个头文件#include <st…

基于React低代码平台开发:构建高效、灵活的应用新范式

文章目录 一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书 随着数字化转型的深入&…

GraphView实时图像刷新

代码&#xff1a; GraphViewTest::GraphViewTest(QWidget *parent): QWidget(parent) {ui.setupUi(this);m_bll BllData::getInstance();connect(m_bll, &BllData::returnImgDataSignal, this, &GraphViewTest::returnImgDataSlot);ui.graphicsView->setHorizonta…

RabbitMQ分享

RabbitMQ遵循AMQP协议&#xff0c;自身采用Erlang RabbitMQ工作模式 生产者发消息&#xff0c;启动多个消费者实例来消费消息&#xff0c;每个消费者仅消费部分信息&#xff0c;可达到负载均衡的效果。 RabbitMQ三种常用交换机类型&#xff1a; 交换机主要起调度分发作用。 …

正弦波生成的傅里叶级数展开法

目录&#xff1a; 一、积分法 二、傅里叶级数展开法 附录、常见波形的傅里叶级数 一、积分法 通过对三角波进行积分&#xff0c;即可得到正弦波。有关内容移步&#xff1a;运算放大器应用汇总1之六、积分电路。 下面对傅里叶级数展开法进行描述。 二、傅里叶级数展开法 三…

高通QNX基线编译原理

下面代码以高通智驾平台为例。 1 QNX应用程序编译原理 在高通提供的qnx开发包中,qnx的内核已经由qnx所提供,所以qnx的编译,其实就是大量应用程序的编译,以及最后利用buildfile文件,把内核,库文件以及应用程序打包在一起的过程。 1.1 qnx的工程目录 应用程序的编译,可…

Tomcat服务部署优化

目录 一.Tomcat的基本内容 1.概念 2.构成 &#xff08;1&#xff09;web容器 &#xff08;2&#xff09;servlet容器&#xff08;catalina&#xff09; &#xff08;3&#xff09;JSP容器 3.Tomcat顶层架构 &#xff08;1&#xff09;Tomcat中最顶层的容器是Server&…

运放设计选型中关注的参数-运算放大器选型参数

1、直流增益&#xff08;AVD&#xff09; 直流增益是运放最重要一个属性之一&#xff0c;其定义为输出电压的变化与输入电压变化之比值&#xff0c;通常用V/mV表示这个比值&#xff0c;例如&#xff0c;增益为30000&#xff0c;可表示为30V/mV&#xff0c;有些地方也会把增益用…

盲行的守护者:盲人应用的温暖相伴

作为一个视障人士&#xff0c;我常常对前方的未知感到迷茫。每一步都像是踏入未知的领域&#xff0c;恐惧与不安时刻伴随着我。然而&#xff0c;一款名为蝙蝠避障的盲人手机应用&#xff0c;成为了我前行的明灯。 在这款盲人手机应用的帮助下&#xff0c;我拥有了新的探知世界的…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中&#xff0c;以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

内核中的Kconfig文件

Kconfig解析 编译内核时用于配置的Kconfig文件 以内核中的ttyprintk.c为例&#xff0c;其位于/kernel-sources/dirver/char/ttyprintk.c 如何将其编译进内核&#xff1f; 在char目录下有Kconfig文件&#xff0c;其中有如下内容 tristate 表示该模块可以选择 Y N M(以.ko形…

【书生·浦语大模型实战营】第 2 节 -课后作业

第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗&#xff1f; 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接&#xff1a;https://github.com/internLM/tutorial 首先&#xff0c;这个课程是免费…

javaWebssh网上超市销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh网上超市销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…

【笔记】React-Native React DevTools

/** * 官网文档&#xff1a;https://reactnative.dev/docs/next/react-devtools */ 1、本想在Demo项目中添加依赖(npx react-devtools)&#xff0c;但其他项目就需要再操作一次&#xff0c;所以全局安装就好了 yarn global add react-devtools 或 npm install -g react-devto…

Groovy

1 Groovy的诞生 Groovy是一门几经重生的语言&#xff0c;该语言由James Stracham和Bob McWhirter于2003年启动开发&#xff0c;之后于2004年3月成为JSR241&#xff08;Java Specification Request&#xff0c;即Java规范请求&#xff09;。不久因为存在一些困难和问题几近放弃。…

Java+SpringBoot+Vue自习室预约系统全栈开发

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Windows Docker 部署 SQL Server

部署 SQL Server 打开 Docker Desktop&#xff0c;切换到 Linux 容器。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 SQL Server 服务。这里安装的是 2022 年版本&#xff0c;如果需要安装其他或者最新版本&#xff0c;可以到 Microsoft Artifact Registry 进行查…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤…

ywtool工具默认功能

提示:工具下载链接在文章最后 目录 一.资源检查二.日志刷新三.工具升级四.linux运维工具ywtool介绍五.ywtool工具下载链接 一.资源检查 只要系统安装了ywtool工具,默认就会配置上"资源检查"的脚本资源检查脚本的执行时间:每天凌晨3点进行检查资源检查脚本的检查内容…

创业者的智选:知识付费小程序定制开发服务解析

探索知识付费领域的新时代&#xff0c;选择专业的知识付费小程序定制开发服务&#xff0c;打造个性化、高效的知识传播平台。无论您是企业、机构还是个体创作者&#xff0c;都能助您成功变现知识资产。 知识付费小程序的开发是一个涉及多方面技术的综合性工程。下面提供一些关…