【嵌入式学习】网络编程day03.02

一、项目

1、TCP机械臂测试

#include <myhead.h>
#define SER_IP "192.168.126.32"
#define SER_PORT 8888
#define CER_IP "192.168.126.42"
#define CER_PORT 9891
int main(int argc, const char *argv[])
{int wfd=-1;//创建套接字if((wfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("error");return -1;}/*struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CER_PORT);cin.sin_addr.s_addr=inet_addr(CER_IP);if(bind(wfd,(struct sockaddr *)&cin,sizeof(cin))==-1){perror("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);if(connect(wfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("error3");return -1;}char red[5]={0xff,0x02,0x00,0x00,0xff};unsigned char blue[5]={0xff,0x02,0x01,0x00,0xff};send(wfd,red,sizeof(red),0);sleep(1);send(wfd,blue,sizeof(blue),0);char c=0;while(1){//写入操作system("stty -icanon");c=getchar();switch(c){case 'w':{red[3]-=5;if(red[3]<=-90){red[3]=-90;}send(wfd,red,sizeof(red),0);break;}case 's':{red[3]+=5;if(red[3]>=90){red[3]=90;}send(wfd,red,sizeof(red),0);break;}case 'a':{blue[3]-=5;if(blue[3]>=180){blue[3]=0;}send(wfd,blue,sizeof(blue),0);	break;}case 'd':{blue[3]+=5;if(blue[3]>=180){blue[3]=180;}send(wfd,blue,sizeof(blue),0);	break;}
fault:{printf("error\n");break;}}}close(wfd);return 0;}

 

2、基于UDP的TFTP的文件传输

#include <myhead.h>
#define SER_IP "192.168.126.32"
#define SER_PORT 69
int Recv(char *name,int cfd,struct sockaddr_in sin)
{//下载请求char pack[516]={0};short *p1 =(short *)pack;*p1 = htons(1);          //设置操作码strcpy(pack+2, name);         //文件名strcpy(pack+2+strlen(name)+1, "octet");            //模式位int packlen = 2+strlen(name)+1 + strlen("octet")+1;    //请求包的大小//向服务器发送请求sendto(cfd,pack,packlen,0,(struct sockaddr *)&sin,sizeof(sin));//打开一个只写文件int wrt_fd=-1;if((wrt_fd=open(name,O_WRONLY|O_CREAT,0664))==-1){perror("wrt_fd error");return -1;}char wbuf[516]="";socklen_t socklen=sizeof(sin);while(1){int recvkeys=recvfrom(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr *)&sin,&socklen);if(recvkeys==-1){perror("recv reeor");close(wrt_fd);return -1;}//printf("接收服务器数据包\n");short pw=ntohs(*(short *)wbuf);short pw1=ntohs(*(short *)(wbuf+2));//		printf("错误码%d\n",pw1);//		printf("%d\n",pw);//		if(pw==3){//printf("正在下载数据\n");//printf("size%d\n",recvkeys);if(recvkeys==516){//printf("正在接收数据\n");write(wrt_fd,wbuf+4,recvkeys-4);char ACK[4];*(short *)ACK=htons(4);*(short *)(ACK+2)=htons(pw1);sendto(cfd,ACK,4,0,(struct sockaddr *)&sin,sizeof(sin));}else if(recvkeys<516){write(wrt_fd,wbuf+4,recvkeys-4);char ACK[4];*(short *)ACK=htons(4);*(short *)(ACK+2)=htons(pw1);	sendto(cfd,ACK,4,0,(struct sockaddr *)&sin,sizeof(sin));printf("下载完毕\n");break;}}	else if(pw==5){printf("ERRROR:%d",pw1);}}close(wrt_fd);
}
int Send(char *name,int cfd,struct sockaddr_in sin)
{char pack[516];short *p1 =(short *)pack;*p1 = htons(2);          //设置操作码strcpy(pack+2, name);         //文件名strcpy(pack+2+strlen(name)+1, "octet");            //模式位int packlen = 2+strlen(name)+1 + strlen("octet")+1;    //请求包的大小//向服务器发送请求sendto(cfd,pack,packlen,0,(struct sockaddr *)&sin,sizeof(sin));//打开一个只读文件int rd_fd=-1;if((rd_fd=open(name,O_RDONLY))==-1){perror("rd_fd error");return -1;}char rbuf[512]="";socklen_t socklen=sizeof(sin);//接收服务器发送的应答包,确认是否可以发送数据int keys=recvfrom(cfd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&sin,&socklen);//提取ACK的操作码short pr=ntohs(*(short *)rbuf);//提取ACK的块编号short pr1=ntohs(*(short *)(rbuf+2));//设置发送数据包的块编号short n=1;//判断操作码是否为4if(pr==4){while(1){//清空数组bzero(rbuf,sizeof(rbuf));int num=read(rd_fd,rbuf,sizeof(rbuf));if(num==0){printf("上传完毕\n");break;}//整合读取数据为数据包并且发送至服务器char data[516];short *p1 =(short *)data;*p1 = htons(3);          //加入操作码*(p1+1)=htons(n);memcpy(data+4,rbuf,num);		//将读取数据整合//向服务器发送数据sendto(cfd,data,sizeof(data),0,(struct sockaddr *)&sin,sizeof(sin));//等待服务器返回应达包char ACK[4];int recvkeys=recvfrom(cfd,ACK,sizeof(ACK),0,(struct sockaddr *)&sin,&socklen);n=ntohs(*(short *)(ACK+2))+1;//printf("%d\n",n);int oc=ntohs(*(short *)(ACK));//printf("%d\n",oc);if(recvkeys==-1){perror("recv reeor");close(rd_fd);return -1;}if(oc==5){printf("error:%d",oc);return -1;}else if(pr==5){printf("ERROR:%d\n",pr1);}}close(rd_fd);}
}
int main(int argc, const char *argv[])
{int wfd=-1;//创建套接字if((wfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("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);	
while(1)
{sleep(1);system("clear");//设置选择界面printf("\t\t***********1、下载**************\t\n");printf("\t\t***********2、上传**************\t\n");printf("\t\t***********3、退出**************\t\n");int key;printf("请选择:");scanf("%d",&key);switch(key){case 1:{char name[128]="";printf("输入下载的文件:");scanf("%s",name);Recv(name,wfd,sin);}break;case 2:{char name[128]="";printf("输入上传的文件:");scanf("%s",name);Send(name,wfd,sin);}break;case 3:{printf("已退出程序\n");return 0;}break;default :{printf("错误输入\n");break;}}
}close(wfd);return 0;
}

现象 

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

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

相关文章

《TCP/IP详解 卷一》第8章 ICMPv4 和 ICMPv6

目录 8.1 引言 8.1.1 在IPv4和IPv6中的封装 8.2 ICMP 报文 8.2.1 ICMPv4 报文 8.2.2 ICMPv6 报文 8.2.3 处理ICMP报文 8.3 ICMP差错报文 8.3.1 扩展的ICMP和多部报文 8.3.2 目的不可达和数据包太大 8.3.3 重定向 8.3.4 ICMP 超时 8.3.5 参数问题 8.4 ICMP查询/信息…

划分开始结束位置设置标记

划分开始结束位置 初始音轨如下图所示 在想开始地方单击左键&#xff0c;长按直到你想要的结束位置松开。就可以划分开始和结束位置 设置标记 方式1 &#xff1a;直接点击该图标 方式二&#xff1a;使用快捷键M 设置标记点可以自定义名称方便检索标记点

javaWebssh酒店客房管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

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

STL容器之string类

文章目录 STL容器之string类1、 什么是STL2、STL的六大组件3、string类3.1、string类介绍3.2、string类的常用接口说明3.2.1、string类对象的常见构造3.2.2、string类对象的容量操作3.2.3、string类对象的访问及遍历操作3.2.4、 string类对象的修改操作3.2.5、 string类非成员函…

车辆维护和燃油里程跟踪器LubeLogger

什么是 LubeLogger &#xff1f; LubeLogger 是一个自托管、开源、基于网络的车辆维护和燃油里程跟踪器。 LubeLogger 比较适合用来跟踪管理您的汽车的维修、保养、加油的历史记录&#xff0c;比用 Excel 强多了 官方提供了在线试用&#xff0c;可以使用用户名 test 和密码 123…

机器学习-4

文章目录 前言数组创建切片索引索引遍历切片编程练习 总结 前言 本篇将介绍数据处理 Numpy 库的一些基本使用技巧&#xff0c;主要内容包括 Numpy 数组的创建、切片与索引、基本运算、堆叠等等。 数组创建 在 Python 中创建数组有许多的方法&#xff0c;这里我们使用 Numpy 中…

14.最长公共前缀

题目&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串""。 解题思路&#xff1a;横向扫描&#xff0c;依次遍历每个字符串&#xff0c;更新最长公共前缀。另一种方法是纵向扫描。纵向扫描时&#xff0c;从前…

基于tomcat的JavaWeb实现

Tomcat服务器 免费&#xff0c;性能一般的服务器 安装配置 基于Java&#xff0c;故需要配置环境变量&#xff0c;新加系统路径JAVA_HOME&#xff0c;路径为jdk的主目录。 而后打开bin目录下的startup.bat文件出现如下窗口说明配置成功 idea继承tomcat服务器 使用java开发…

Linux 之压缩与解压相关命令的基础用法

目录 1、zip 与 unzip 2、gzip 命令 3、tar 命令 1、zip 与 unzip 在桌面新建一个文件和文件夹用于测试 在 test 目录下有一个 1.txt 文件 我们使用 zip 命令对其压缩 用法&#xff1a; zip 自定义压缩包名 被压缩文件路径位置 zip myon.zip 1.txt 因为我们这里就是在 …

linux_day04

大纲&#xff1a;命令&#xff0c;vim&#xff0c;gcc&#xff0c;编译工具&#xff0c;生成代码&#xff0c;调试&#xff0c;库makefile&#xff0c;系统编程 文件系统&#xff1a;文件属性&#xff0c;文件内容&#xff0c;万物皆文件&#xff08;不在内存中的是文件&#…

ProtoBuf 是什么?

1. 序列化概念 序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程称为对象的反序列化。 什么情况下需要序列化 存储数据&#xff1a;当你想把的内存中的对象状态保存到⼀个⽂件中或者存到数…

怎么压缩成mp4视频?

在数字化时代&#xff0c;视频已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到视频文件太大的问题&#xff0c;不便于传输、存储或分享。那么&#xff0c;如何将视频压缩成MP4格式&#xff0c;以减小文件大小呢&#xff1f;本文将为您介绍几种简…

docker学习第一步:基于Linux安装docker!

要求Linux下的CentOS 7.0 以上的版本 01、安装docker版本仓库 1、设置仓库 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2、稳定仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 现在我也找了很…

医学大数据|文献阅读|有关“胃癌+机器学习”的研究记录

目录 1.基于32基因特征构建的机器学习模型可有效预测胃癌患者的预后和治疗反应 2.胃癌患者术后90天死亡率的机器学习风险预测模型 3.使用机器学习模型预测幽门螺杆菌根除患者胃癌患病风险 4.利用初始内窥镜检查和组织学结果进行个性化胃癌发病率预测 1.基于32基因特征构建的…

查看网络连接的netstat

netstat是一个监控TCP/IP网络的非常有用的工具&#xff0c;可以显示路由表、实际的网络连接&#xff0c;以及每一个网络接口设备的状态信息&#xff0c;可以让用户得知目前都有哪些网络连接正在运作。netstat用户显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用…

【Vue3】PostCss 适配

px 固定的单位&#xff0c;不会进行自适应。rem r root font-size16px 1rem16px&#xff0c;但是需要手动进行单位的换算vw vh 相对于视口的尺寸&#xff0c;不同于百分比&#xff08;相对于父元素的尺寸&#xff09;375屏幕 1vw 3.75px 利用插件进行 px&#xff08;设计稿&…

Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略

前言 随着容器技术的日益成熟&#xff0c;Docker已经成为现代软件开发和部署的标配工具。其中&#xff0c;自定义Docker镜像是满足特定项目需求的关键步骤。特别是在Java开发环境中&#xff0c;我们可能需要为不同的项目配置不同版本的JDK。这时&#xff0c;通过Docker自定义J…

List<Object>集合对象属性拷贝工具类

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝&#xff0c;但如果应用到List集合的话就需要遍历去操作了&#xff0c;如下&#xff1a; 打印结果&#xff1a; …

Cocos Creator 3.8.x 后效处理(前向渲染)

关于怎么开启后效效果我这里不再赘述&#xff0c;可以前往Cocos官方文档查看具体细节&#xff1a;后效处理官网 下面讲一下怎么自己定义一个后处理效果&#xff0c;想添加自己的后效处理的话只需要在postProcess节点下添加一个BlitScreen 组件即可&#xff0c;然后自己去添加自…

Selenium基础:自动化你的网页交互!

在构建Python爬虫的过程中&#xff0c;你可能会遇到需要与网页进行交互的情况&#xff0c;比如填充表单、点击按钮等。这时&#xff0c;Selenium库就成了你的有力工具。Selenium是一个强大的工具&#xff0c;能够模拟用户在网页上的各种操作。本篇博客将向你介绍Selenium的基础…