当前位置: 首页 > news >正文

day03-网络编程

1>TCP机械臂测试

#include<myhead.h>
#define SER_IP "10.211.55.11"
#define SER_PORT 8888
#define CLI_IP "10.211.55.9"
#define CLI_PORT 6666
//客户端
int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);          //3//将端口号快速重用(设置广播/组播)int reuse = 1;if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)PRINT_ERR("");printf("端口号快速重用成功\n");
/*//2、绑定(非必须)//2.1struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);//2.2if((bind(cfd,(struct sockaddr*)&cin,sizeof(cin))) == -1)PRINT_ERR("");*///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);   //ip地址//3.2 连接服务器if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//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);if(key == '\n')continue;getchar();switch (key){case 'W':case 'w':{rbuf[3]+=5;if(rbuf[3]>=90)rbuf[3]=90;send(cfd,rbuf,sizeof(rbuf),0);}break;case 'S':case 's':{rbuf[3]-=5;if(rbuf[3]<=-90)rbuf[3]=-90;send(cfd,rbuf,sizeof(rbuf),0);}break;case 'D':case 'd':{bbuf[3]+=5;if(bbuf[3]>=180)bbuf[3]=180;send(cfd,bbuf,sizeof(bbuf),0);}break;case 'A':case 'a':{bbuf[3]-=5;if(bbuf[3]>=180)bbuf[3]=0;send(cfd,bbuf,sizeof(bbuf),0);}break;default:printf("输入错误,请重新输入\n");break;}}//5、关闭套接字close(cfd);return 0;
}

2>基于UDP的TFTP文件传输

#include<myhead.h>
#define SER_IP "10.211.55.11"
#define SER_PORT 69//客户端
void menu()
{printf("*************************\n");printf("*\t 1.下载  \t*\n");printf("*\t 2.上传  \t*\n");printf("*\t 0.退出  \t*\n");printf("*************************\n");
}
int rev(int choice)
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);          ////3.填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;   //地址族sin.sin_port =     htons(SER_PORT);   //端口号sin.sin_addr.s_addr = inet_addr(SER_IP);   //ip地址socklen_t socklen = sizeof(sin);//3、收发数据char pack[516] = "";char ack[4];//校验收到的块编号int N = 0;char filename[128]="";printf("请输入要下载的文件名:");scanf("%s",filename);//组件协议包:下载请求short *p1 = pack;*p1 = htons(choice);          //设置操作码char *p2 = p1+1;strcpy(p2, filename);         //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet");            //模式位int packlen = 4+strlen(p2) + strlen(p4);    //请求包的大小//向服务器发送请求包sendto(cfd, pack, packlen, 0, (struct sockaddr*)&sin, sizeof(sin));p1=NULL;free(p1);p2=NULL;free(p2);p4=NULL;free(p4);//建立文件int fd = -1;if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)PRINT_ERR("");while(1){bzero(pack, sizeof(pack));//收取服务器发来的数据包int ret=recvfrom(cfd, pack, sizeof(pack), 0, (struct sockaddr*)&sin, &socklen);//获取发送来的操作码short *p=pack;short code = ntohs(*p);//获取发送来的块编号short num = ntohs(*(p + 1));
//        printf("%d %d %d\n",code,num,ret);write(fd,pack+4,ret-4);//判断数据包的是否为3  以及 数据包数据内容是否为512if(3 == code && num == N + 1){N++;//如果为512,则读取后,回复一个应打包,继续接收下一个// 组装ACKshort *a=ack;*a = htons(4);*(a + 1) = htons(num);sendto(cfd, ack, 4, 0, (struct sockaddr*)&sin, sizeof(sin));if(ret<512){printf("下载完成!\n");break;}}}//5、关闭套接字close(cfd);}int snd(int choice)
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);          //3//3.填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;   //地址族sin.sin_port =     htons(SER_PORT);   //端口号sin.sin_addr.s_addr = inet_addr(SER_IP);   //ip地址socklen_t socklen = sizeof(sin);//3、收发数据char pack[516] = "";char ack[4];char filename[128]="";printf("请输入要上传的文件名:");scanf("%s",filename);//组件协议包:下载请求short *p1 = pack;*p1 = htons(choice);          //设置操作码char *p2 = p1+1;strcpy(p2, filename);         //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet");            //模式位int packlen = 4+strlen(p2) + strlen(p4);    //请求包的大小//向服务器发送请求包sendto(cfd, pack, packlen, 0, (struct sockaddr*)&sin, sizeof(sin));p1=NULL;free(p1);p2=NULL;free(p2);p4=NULL;free(p4);int ret = 0;//打开文件int fd = -1;if((fd=open(filename,O_RDONLY)) == -1)PRINT_ERR("");char rbuf[512]="";while(1){//收取服务器发来的ackrecvfrom(cfd, ack, 4, 0, (struct sockaddr*)&sin, &socklen);//获取发送来的操作码short *a=ack;short code = ntohs(*a);//获取发送来的块编号short num = ntohs(*(a + 1));//        printf("%d %d \n",code,num);if(4 == code && (ret = read(fd,rbuf,sizeof(rbuf)))>0){bzero(pack, sizeof(pack));short *p1 = pack;*p1 = htons(3);short *p2 = p1 + 1;*p2 = htons(num+1);short *p4 = p2 + 1;strcpy(p4, rbuf);            //模式位packlen=4+strlen(rbuf);
//            printf("%d %d \n",num,packlen);sendto(cfd, pack, packlen, 0, (struct sockaddr*)&sin, sizeof(sin));}else{printf("上传完成!\n");break;}}//5、关闭套接字close(cfd);
}int main(int argc, const char *argv[])
{int choice = 0;while (1){menu();printf("请输入操作:");scanf("%d",&choice);switch (choice){case 1: rev(choice);break;case 2: snd(choice);break;case 0: exit(0);break;default:printf("输入错误,请重新输入\n");break;}getchar();getchar();system("clear");}return 0;
}

http://www.lryc.cn/news/310648.html

相关文章:

  • Java反射,动态代理。笔记
  • 作为团队开发组长你需要做的:
  • Windows安装Neo4j数据库教程(3.X版本)
  • 无人机飞行控制系统技术,四旋翼无人机控制系统建模技术详解
  • 程序员的金三银四求职宝典:如何在关键时期脱颖而出?
  • 分享经典、现代和前沿软件工程课程
  • 网络工程师笔记3
  • 【菜鸟入门!】Matlab零基础快速入门教程
  • 数据中心GPU集群高性能组网技术分析
  • go垃圾回收
  • 如何做代币分析:以 LEO 币为例
  • 数制和码制
  • Git Bash中安装tree
  • java开源 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 小程序商城搭建
  • C++练手题系列一
  • (下)async/await高级用法,你会多少种呢?
  • 阅读笔记 | REFORMER: THE EFFICIENT TRANSFORMER
  • 光路科技:工业以太网交换机引领工业互联网新篇章
  • 航拍无人机技术,航拍无人机方案详解,无人机摄影技术
  • 【ArcPy】游标访问几何数据
  • Java云计算k8s
  • 蜂窝物联:物联网大数据云平台功能模块简介
  • Docker镜像导出/导入
  • SwiftUI 如何在运行时从底层动态获取任何 NSObject 对象实例
  • LeetCode 2161.根据给定数字划分数组
  • ip获取+归属地实现
  • Python的错误和异常
  • C语言-------指针进阶(2)
  • Spring El表达式官方文档学习
  • RK3568 android11 调试陀螺仪模块 MPU6500