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

网络编程学习

1.编写机械臂简易客户端

#include<myhead.h>#define SER_IP "192.168.108.153"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket 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);socklen_t addrlen=sizeof(sin);//连接服务器if(connect(sfd,(struct sockaddr*)&sin,addrlen)==-1){perror("connect error");return -1;}//初始化机械臂char rbuf[5]={0xff,0x02,0x00,0xa6,0xff};unsigned char bbuf[5]={0xff,0x02,0x01,0xb4,0xff};send(sfd,rbuf,sizeof(rbuf),0);send(sfd,bbuf,sizeof(bbuf),0);printf("按w红色手臂角度增大\n");printf("按s红色手臂角度增大\n");printf("按d蓝色手臂角度增大\n");printf("按a蓝色手臂角度增大\n");printf("按q退出\n");//操控机械臂char c;while(1){c=getchar();switch(c){case 'w':{if(rbuf[3]>=0x5a)break;rbuf[3]+=2;send(sfd,rbuf,sizeof(rbuf),0);break;}case 's':{if(rbuf[3]>=0xa6)break;rbuf[3]-=2;send(sfd,rbuf,sizeof(rbuf),0);break;}case 'd':{if(bbuf[3]>=0xb4)break;bbuf[3]+=2;send(sfd,bbuf,sizeof(bbuf),0);break;}case 'a':{if(bbuf[3]<=0x02&&bbuf[3]!=0x00)bbuf[3]=0x00;else if(bbuf[3]==0x00)break;bbuf[3]-=2;send(sfd,bbuf,sizeof(bbuf),0);break;}case 'q':{rbuf[3]=0xa6;bbuf[3]=0xb4;send(sfd,rbuf,sizeof(rbuf),0);send(sfd,bbuf,sizeof(bbuf),0);close(sfd);return 0;}default :break;}}return 0;
}

2、基于UDP完成tftp客户端实现

#include<myhead.h>#define SER_PORT 69//定义下载文件函数
int my_copy(int sfd,struct sockaddr_in sin,socklen_t addrlen)
{char buf[516]="";char filename[20]="";printf("请输入你要下载的文件名:\n");getchar();fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;//用只写的形式打开一个文件int fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd==-1){perror("open error");return -1;}//确认是下载文件,还是传输文件short *p1=(short *)buf;*p1=htons(1);//要下载或者传输的数据名char *p2=buf+2;strcpy(p2,filename);//填入模式char *p4=p2+strlen(filename)+1;strcpy(p4,"octet");//定义传输大小int size=2+strlen(p2)+strlen(p4)+2;//传输请求sendto(sfd,buf,size,0,(struct sockaddr*)&sin,addrlen);//数据收发while(1){int res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);if(res==-1){perror("recvfrom error");close(sfd);close(fd);return -1;}char *p=buf+4;p1=(short *)buf;//如果发过来的是错误信息if(ntohs(*p1)==5){printf("%s\n",p);close(sfd);close(fd);return -1;}int num=res-4;  //文件中可能有\0,所以不能用strlen求读取的大小//写入数据if(num<512){write(fd,p,num);break;}write(fd,p,num);*p1=htons(4);//发送acksendto(sfd,buf,4,0,(struct sockaddr*)&sin,addrlen);}close(fd);printf("下载成功\n");return 0;
}//定义文件传输函数
int my_trans(int sfd,struct sockaddr_in sin,socklen_t addrlen)
{char buf[516]="";char filename[20]="";printf("请输入你要传输的文件名:\n");getchar();fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;//用只写的形式打开一个文件int fd=open(filename,O_RDONLY);if(fd==-1){perror("open error");return -1;}//确认是下载文件,还是传输文件short *p1=(short *)buf;*p1=htons(2);//要下载或者传输的数据名char *p2=buf+2;strcpy(p2,filename);//填入模式char *p4=p2+strlen(filename)+1;strcpy(p4,"octet");//定义传输大小int size=2+strlen(p2)+strlen(p4)+2;//传输请求sendto(sfd,buf,size,0,(struct sockaddr*)&sin,addrlen);int count=1;char rbuf[512]="";int res1=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);if(res1==-1){perror("rescvfrom error");close(sfd);close(fd);return -1;}p1=(short *)buf;//如果接收的是错误信息if(ntohs(*p1)==5){printf("%s\n",buf+4);close(sfd);close(fd);return -1;}char *k2=(char *)buf+2;if(ntohs(*k2)!=0){close(sfd);close(fd);return -1;}//数据收发while(1){bzero(rbuf,0);int res=read(fd,rbuf,sizeof(rbuf));if(res==0)break;else if(res==-1){perror("read error");close(fd);return -1;}*p1=htons(3);     //发送包的操作码short *k=(short *)(buf+2);*k=htons(count);char *p=buf+4;memcpy(p,rbuf,res);int size1=2+2+res;//发送数据包sendto(sfd,buf,size1,0,(struct sockaddr*)&sin,addrlen);//接受ack包if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen)==-1){perror("rescvfrom error");close(fd);}//p1=(short *)buf;//如果接收的是错误信息if(ntohs(*p1)==5){printf("%s\n",p);close(fd);return -1;}k=(short *)(buf+2);if(ntohs(*k)!=count){close(fd);return -1;}//count自增count++;}close(fd);printf("下载成功\n");return 0;
}int main(int argc, const char *argv[])
{if(argc!=2){printf("请先输入IP地址:\n");return -1;}int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket 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(argv[1]);socklen_t addrlen=sizeof(sin);while(1){printf("1>>>>>>>>>下载文件\n");printf("2>>>>>>>>>传输文件\n");printf("3>>>>>>>>>退出系统\n");int choose;printf("请输入操作:\n");scanf("%d",&choose);switch(choose){case 1:{if(my_copy(sfd,sin,addrlen)==-1)return -1;break;}case 2:{if(my_trans(sfd,sin,addrlen)==-1)return -1;break;}case 3:{close(sfd);return 0;}default :{printf("无效的操作,请重新输入操作\n");break;}}}return 0;
}


文章转载自:

http://jLHu6Cra.fjntg.cn
http://nZ5pFiXc.fjntg.cn
http://Eg3MPnca.fjntg.cn
http://dcGmrNTA.fjntg.cn
http://jIFLs3oA.fjntg.cn
http://ahPvXGn0.fjntg.cn
http://q7CHIhOk.fjntg.cn
http://ctWBtavd.fjntg.cn
http://mCgdsEP2.fjntg.cn
http://TVIwS0FQ.fjntg.cn
http://lXjSjGUX.fjntg.cn
http://t1gJ4s9w.fjntg.cn
http://jMqD0MhM.fjntg.cn
http://ghJr15z2.fjntg.cn
http://LxfQx8Oh.fjntg.cn
http://djn4MmDo.fjntg.cn
http://yLmUeg4h.fjntg.cn
http://JXzQgA4i.fjntg.cn
http://7RVOiTd6.fjntg.cn
http://Wd2eYGVx.fjntg.cn
http://6PjfUNn0.fjntg.cn
http://AMmzSLr0.fjntg.cn
http://2do97VXJ.fjntg.cn
http://vXmaTYzu.fjntg.cn
http://i2h6pTOo.fjntg.cn
http://JBtVN4Zd.fjntg.cn
http://6g7mYcRb.fjntg.cn
http://XinNZuzo.fjntg.cn
http://iTTFOslq.fjntg.cn
http://vF1N7rQL.fjntg.cn
http://www.dtcms.com/a/376694.html

相关文章:

  • App 上架全流程指南,iOS App 上架步骤、App Store 应用发布流程、uni-app 打包上传与审核要点详解
  • Java Flow API — Publisher、Subscriber 与 Processor 实战
  • 基于POI-TL实现动态Word模板数据填充(含图表):从需求到落地的完整开发实践
  • 【大模型-写作】STORM提升文章深度
  • (纯新手教学)计算机视觉(opencv)实战十四——模板与多个对象匹配
  • 论文阅读:arxiv 2024 Large Language Model Enhanced Recommender Systems: A Survey
  • 微店平台商品详情接口技术实现:从接口解析到数据结构化全方案
  • (12)使用 Vicon 室内定位系统(一)
  • 疯狂星期四文案网第65天运营日记
  • 【从零开始】12. 一切回归原点
  • JavaSE之深入浅出 IO 流:字节流、字符流与序列化流详解(含完整代码示例)
  • 【大模型推理】Qwen2.5模型硬件要求与4090Ti多并发推理方案
  • Node 中进程与子进程的区别及使用场景
  • 【C++进阶系列】:万字详解红黑树(附模拟实现的源码)
  • 以供应链思维为钥,启数字化转型之门——读《供应链思维》有感
  • 体验访答浏览器
  • Zynq开发实践(FPGA之spi实现)
  • 2025年度总结
  • Redis 哨兵模式详解:实现高可用的自动故障转移方案
  • 电动汽车充电系统(EVCS)的入侵检测
  • 自定义事件发布器
  • 零基础学AI大模型之从0到1调用大模型API
  • vue3:调用接口的时候怎么只传递一个数组进去,得到一个key-value数据
  • Transformer 训不动:注意力 Mask 用反 / 广播错位
  • Prometheus部署监控实战
  • vue3引入海康监控视频组件并实现非分屏需求一个页面同时预览多个监控视频(2)
  • AGV 智能车驱动仓储效率提升:应用场景,智慧物流自动化实践指南
  • 【全栈实战】Elasticsearch 8.15.2 高可用集群部署与AI搜索全特性指南
  • Django REST Framework 构建安卓应用后端API:从开发到部署的完整实战指南
  • neo4j数据库创建范例(SQL文)