网络编程:TCP机械臂,UDP文件传输

1.TCP机械臂测试

程序代码:

  1 #include<myhead.h>2 #define SER_IP "192.168.126.112"  //服务器IP3 #define SER_PORT 8888          //服务器端口号4 5 #define CLI_IP "192.168.126.121" //客户端IP6 #define CLI_PORT 9999       //客户端端口号7 int main(int argc, const char *argv[])8 {9     //1.创建用于通信的套接字文件描述符10     int cfd=socket(AF_INET,SOCK_STREAM,0);  //通信协议族,IPv4;指定通信类型,TCP;参数2已指定通信类型11     if(cfd==-1)12     {13         perror("socket error");14         return -1;15     }16     printf("cfd=%d\n",cfd);17     //2.绑定(非必须)18     //2.1填充地址信息结构体19     struct sockaddr_in cin;20     cin.sin_family=AF_INET;//地址族,IPv421     cin.sin_port=htons(CLI_PORT);//端口号,主机号转换为网络号,2字节22     cin.sin_addr.s_addr=inet_addr(CLI_IP);//ip地址,点分十进制转为4字节无符号网络字节序23     //2.2绑定,将ip地址和端口号绑定到套接字文件描述符24     if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)25         //文件描述符;26         //通信地址信息结构体,不同通信方式,结构体不同,将具体地址信息强转为该类型,地址27         //结构体大小,值28     {29         perror("bind error");30         return -1;31     }32     printf("bind success\n");33     //3.连接服务器34     //3.1填充要连接的服务器地址信息结构体35     struct sockaddr_in sin;36     sin.sin_family=AF_INET;//地址族IPv437     sin.sin_port=htons(SER_PORT);//端口号,主机号转换为网络号38     sin.sin_addr.s_addr=inet_addr(SER_IP);//ip地址,点分十进制转为4字节无符号网络字节序39     //3.2连接服务器40     if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)41         //套接字文件描述符42         //要发送数据起始地址43         //要发送数据大小44         //是否阻塞,0阻,MSG_DONTWAIT非阻塞45     {46         perror("connect error");47         return -1;48     }49     printf("connect success\n");50     //4.数据收发51     char rbuf[5]={0xff,0x02,0x00,0x00,0xff};52     //起始结束协议,固定的;控制机械臂协议,固定的53     //x指定操作机械臂,0x00红,0x01蓝;y:指定角度54     unsigned char bbuf[5]={0xff,0x02,0x01,0x00,0xff};55     //发送给服务器当做初始值56     send(cfd,rbuf,sizeof(rbuf),0);//文件描述符;要发送数据起始地址;数据大小;是否阻塞57     sleep(1);58     send(cfd,bbuf,sizeof(bbuf),0);59     char key=0;//接收键盘输入的字符60     while(1)61     {62         system("clear");//执行终端指令63         scanf("%c",&key);//键盘输入一个字符64         getchar();//吸收垃圾字符,回车65         switch(key)66         {67             //红色机械臂68         case 'W':69         case 'w':70             {71                 rbuf[3]+=5;//每次操作角度增加5度72                 if(rbuf[3]>=90)73                     rbuf[3]=90;74                 send(cfd,rbuf,sizeof(rbuf),0);75             }76             break;77         case 'S':78         case 's':79             {80                 rbuf[3]-=5;//每次操作角度减小5度81                 if(rbuf[3]<=-90)82                     rbuf[3]=-90;83                 send(cfd,rbuf,sizeof(rbuf),0);84             }85             break;86             //蓝色机械臂87         case 'D':88         case 'd':89             {90                 bbuf[3]+=5;//每次操作角度增加91                 if(bbuf[3]>=180)92                     bbuf[3]=180;93                 send(cfd,bbuf,sizeof(bbuf),0);94             }95             break;96         case 'A':97         case 'a':98             {99                 bbuf[3]-=5;//每次操作角度减小
100                 if(bbuf[3]<=0)
101                     bbuf[3]=0;
102                 send(cfd,bbuf,sizeof(bbuf),0);
103             }
104             break;
105         case 'Q':
106         case 'q':
107             goto END;
108         default:printf("enter error\n");
109         }
110     }
111 END:
112     //5.关闭套接字
113     close(cfd);
114     return 0;
115 }                                                                                                                                                                                                                                                      
~                                                                                                                                                                                                                                                          
~                

运行结果:

2. 基于UDP的TFTP文件传输

程序代码:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服务端IP
#define SER_PORE 69                     //端口号//定义下载函数
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;
}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.下载******\n");printf("\t******2.上传********\n");printf("\t******3.退出******\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("enter error\n");break;}}END://3.关闭套接字close(cfd);return 0;
}

运行结果:

 流程图:

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

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

相关文章

LeetCode 刷题 [C++] 第763题.划分字母区间

题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 …

看看技术大佬是如何把ls命令玩到飞起

关注公众号&#xff1a;“DevOps实战派”&#xff0c;获取更多DevOps和运维的精彩内容。 Linux中一个基本命令是ls&#xff0c;没有这个命令&#xff0c;我们会在浏览目录条目时会遇到困难。 ls命令用于列出文件和目录&#xff0c;默认上&#xff0c;它会列出当前目录的内容。…

Synchronized方法锁、对象锁、类锁区别

synchronized&#xff0c;这个东西我们一般称之为”同步锁“&#xff0c;他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象。 在修饰方法的时候&#xff0c;默认是当前对象作为锁的对象在修饰类时&#xff0c;默认是当前类的Class对象作为所的对象 故存在着方法锁、…

【MySQL】事务管理 -- 详解

一、前言 CURD 不加控制&#xff0c;会有什么问题&#xff1f; CURD 满足什么属性&#xff0c;能解决上述问题&#xff1f; 买票的过程得是原子的。买票应该不能受互相的影响。买完票应该要永久有效。买前和买后都要是确定的状态。 什么是事务&#xff1f; 事务就是一组 DML…

网络编程作业day3

项目作业1&#xff1a;TCP机械臂测试 客户端操作代码&#xff1a; /*机械臂客户端控制代码*/ #include <myhead.h>#define SER_IP "192.168.125.176" //机械臂服务器IP地址 #define SER_PORT 8888 //机械臂服务器端口号 #define CLI_IP "…

Vue 项目重复点击菜单刷新当前页面

需求&#xff1a;“在当前页面点击当前页面对应的菜单时&#xff0c;也能刷新页面。” 由于 Vue 项目的路由机制是路由不变的情况下&#xff0c;对应的组件是不重新渲染的。所以重复点击菜单不会改变路由&#xff0c;然后页面就无法刷新了。 方案一 在vue项目中&#xff0c;…

深入了解 JavaScript 混淆加密和环境检测

JavaScript混淆加密是一种通过修改代码结构和命名约定来增加代码的复杂性&#xff0c;使其难以被理解和逆向工程的技术。在这篇文章中&#xff0c;我们将深入探讨JS混淆加密的一些逻辑&#xff0c;并介绍如何通过环境检测来提高代码的安全性。我们将使用案例代码演示这些概念。…

List集合按中文拼音排序,或按自己想要顺序的调整排序

1.你要按拼音排序&#xff08;字母同音依次比后面字母&#xff09; //集合按中文拼音排序Collections.sort(collect,new Comparator() {Overridepublic int compare(Object o1, Object o2) {return chineseCompare(o1,o2);}});//排序方法private static int chineseCompare(Obj…

STM32用标准库编写按键控制LED灯的proteus仿真

首先打开proteus仿真软件&#xff0c;绘制电路图&#xff1a; 或是下载我已经建立好的工程修改&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?pwd1234 提取码&#xff1a;1234 第一步复制整个工程文件夹&#xff0c;就不用重新配置的辛苦…

论文阅读:2017MobileNet V1谷歌轻量化卷积神经网络

拓展&#xff1a;贾扬清&#xff1a;深度学习框架caffe&#xff08;Convolutional Architecture for Fast Feature Embedding&#xff09; 主要贡献&#xff1a; 深度可分离卷积&#xff08;Depthwise separable convolution&#xff09;逐点卷积&#xff08;Pointwise convo…

C++笔试题(选择+编程)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 选择题 请找出下面程序中有哪些错误&#xff08;&#xff09; int main() {int i 10;int j 1;const int *p1;//(1)int const *p2 &i; //(2)p2 &j;//(3)int *const p3 &i;//(4)*p3 20;//(5)*p2 30;//(6…

LeetCode 刷题 [C++] 第279题.完全平方数

题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11…

redis运维

1.备份redis配置文件 cp /etc/redis.conf /etc/redis.conf.bak 2.将redis中不要的注释和空行删除 sed -i /^#/d; /^$/d /etc/redis.conf 3.redis配置文件 bing 0.0.0.0 &#xff1a;绑定本机所有网卡 daemonize yes&#xff1a;设置后台运行 requirepass redispwd…

k8s初始化错误

报错详情&#xff1a; you can check the kubelet logs for further clues by running: ‘journalctl -u kubelet’ Alternatively, there might be issues with your Kubernetes configuration files or maybe the necessary ports are not opened. Check the status of …

rust多个mod文件引用和文件夹mod使用注意事项

如果mod文件都在同一级目录&#xff0c;则直接使用就可以&#xff0c;因为rust文件都是一个隐藏的mod&#xff0c;但是如果mod文件在另外一个目录下面&#xff0c;就需要在目录下面声明一个mod.rs文件&#xff0c;这样才能将那个目录识别为一个mod&#xff0c;可以在mod.rs里面…

鸿蒙App开发新思路:小程序转App

国家与国家之间错综复杂&#xff0c;在谷歌的安卓操作系统“断供”后&#xff0c;鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日&#xff0c;华为宣布&#xff0c;不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世&#xff0c;并与2024年Q4正…

Flutter Text 下划线

IntrinsicWidth(child: Column(mainAxisAlignment:MainAxisAlignment.center,children: [Text("工单名称",style: TextStyle(overflow: TextOverflow.fade,color: AppColors.baseColor,fontSize: 15.sp,// decorationStyle: TextDecorationStyle.dashed),),Container…

马士超:符合国际标准的沉浸式音频HOLOSOUND的发展与未来 | 演讲嘉宾公布

一、3D音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&a…

【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

不知道RAID/SAN/NAS的小可爱来看看这个吧!

RAID RAID&#xff08;冗余阵列的独立磁盘&#xff0c;Redundant Array of Independent Disks&#xff09;是一种将多个磁盘驱动器组合成一个或多个单元的技术&#xff0c;目的是在提高数据可靠性和/或提升性能的同时&#xff0c;对操作系统隐藏底层的复杂性。简而言之&#x…