网络编程: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.hqwc.cn/news/509331.html

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

相关文章

C++ 第三方boost库 windows编译

网址 https://levelup.gitconnected.com/the-definite-guide-on-compiling-and-linking-boost-c-libraries-for-visual-studio-projects-c79464d7282d https://www.boost.org/ 安装 下载boost源码包 解压到本地 打开vs命令行 进入当前目录&#xff0c;执行编译&#xff0…

vs 设置项目依赖的cmake 版本

cmake_minimum_required(VERSION 3.16) cmakelist.txt 这句话都不陌生&#xff0c; 设置依赖的最低cmake版本 可是当电脑上装了好几种版本的cmake&#xff0c; 并且每个项目依赖的版本都不同 以及需要vs 可视化界面编译时 找不到地方设置&#xff08;找了两次 没找到 百度也…

【论文阅读】TensoRF: Tensorial Radiance Fields 张量辐射场

发表于ECCV2022. 论文地址&#xff1a;https://arxiv.org/abs/2203.09517 源码地址&#xff1a;https://github.com/apchenstu/TensoRF 项目地址&#xff1a;https://apchenstu.github.io/TensoRF/ 摘要 本文提出了TensoRF&#xff0c;一种建模和重建辐射场的新方法。不同于Ne…

matlab:涉及复杂函数图像的交点求解

matlab&#xff1a;涉及复杂函数图像的交点求解 在MATLAB中求解两个图像的交点是一个常见的需求。本文将通过一个示例&#xff0c;展示如何求解两个图像的交点&#xff0c;并提供相应的MATLAB代码。 画出图像 首先&#xff0c;我们需要绘制两个图像&#xff0c;以便直观地看…

【作者有话说】意见专业,审稿友好,JCR3区SCI仅10天检索!

录用案例 JCR3区机械工程类SCI (进展顺) 【期刊简介】IF&#xff1a;2.0-3.0&#xff0c;JCR3区&#xff0c;中科院4区&#xff1b; 【检索情况】SCI在检&#xff1b; 【录用周期】3-5个月左右录用&#xff1b; 【征稿领域】复杂系统的智能传感和高级故障诊断相关领域均可&…

学习使用paddle来构造hrnet网络模型

1、首先阅读了hrnet的网络结构分析&#xff0c;了解到了网络构造如下&#xff1a; 参考博文姿态估计之2D人体姿态估计 - &#xff08;HRNet&#xff09;Deep High-Resolution Representation Learning for Human Pose Estimation&#xff08;多家综合&#xff09;-CSDN博客 最…

类和对象提高

此篇继续讲解类和对象的提高知识&#xff0c;包括默认成员函数、运算符重载等相关内容&#xff0c;没有看过 C基础知识和类和对象基础知识&#xff08;可翻阅我的文章&#xff09;的小伙伴&#xff0c;可以先收藏&#xff0c;之后学习完再看效果会更好哦。 默认成员函数 在一…

力扣 第 387 场周赛 解题报告 | 珂学家 | 离散化树状数组 + 模拟场

前言 整体评价 手速场模拟场&#xff0c;思路和解法都蛮直接的。 所以搞点活 如果T2&#xff0c;如果不固定左上角&#xff0c;批量查询某个点为左上角&#xff0c;求满足总和 ≤ k \le k ≤k的子矩阵个数 如果T2&#xff0c;如果不固定左上角&#xff0c;求总和 ≤ k \le k…

老年人居家安全问题,全视通社区居家养老解决方案来赋能

近年来&#xff0c;老年人居家环境问题逐渐受到社会的关注。从新闻报道得知&#xff0c;传统居家环境对老年人存在诸多挑战&#xff0c;比如在入户空间、起居&#xff08;室&#xff09;厅、卧室、卫生间、厨房等区域。这些挑战不仅影响老年人的生活质量&#xff0c;还可能导致…

【大厂AI课学习笔记NO.60】(13)模型泛化性的评价

我们学习了过拟合和欠拟合&#xff0c;具体见我的文章&#xff1a;https://giszz.blog.csdn.net/article/details/136440338 那么今天&#xff0c;我们来学习模型泛化性的评价。 泛化性的问题&#xff0c;我们也讨论过了&#xff0c;那么如何评价模型的泛化性呢&#xff1f; …

vue 常用的 UI 组件库之一:Vuetify组件库

Vuetify是一个基于Vue.js 的Material Design组件库&#xff0c;它提供了一套完整的、预构建的、可自定义的、响应式的组件&#xff0c;以便开发者可以快速构建美观且功能强大的Web应用程序。Vuetify遵循Material Design设计指南&#xff0c;提供了一系列易于使用的组件&#xf…

[项目设计] 从零实现的高并发内存池(二)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 2.高并发内存池整体架构 3.ThreadCache实现 3.1 ThreadCache整体架构…