網絡編程: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.pswp.cn/news/718820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718820.shtml
英文地址,請注明出處:http://en.pswp.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…

【java】使用七牛云上傳文件

注冊七牛云 - 小王小王ii - 博客園 (cnblogs.com) 1.依賴 <dependencies><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.7</version></dependency><dependency>…

一些Springboot有用的配置:application.properties、xml訪問mybatis數據庫

application.properties #驅動類名稱 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #數據庫連接的url spring.datasource.urljdbc:mysql://localhost:3306/tlias #連接數據庫的用戶名 spring.datasource.usernameroot #連接數據庫的密碼 spring.datasource.p…

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…

#LLM入門|Prompt#2.7_檢查結果_Check_Outputs

引領你了解 如何評估系統生成的輸出。確保在向用戶展示輸出之前&#xff0c;對其質量、相關性和安全性進行嚴格的檢查&#xff0c;以保證我們提供的反饋是準確和適用的。如何運用審查(Moderation) API 來對輸出進行評估如何通過額外的 Prompt 提升模型在展示輸出之前的質量評估…

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 …

題目 1434: 藍橋杯歷屆試題-回文數字

題目描述: 觀察數字&#xff1a;12321&#xff0c;123321 都有一個共同的特征&#xff0c;無論從左到右讀還是從右向左讀&#xff0c;都是相同的。這樣的數字叫做&#xff1a;回文數字。 本題要求你找到一些5位或6位的十進制數字。滿足如下要求&#xff1a; 該數字的各個數位…

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正…