小項目:2024/3/2

一、TCP機械臂測試

代碼:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服務器端IP
#define SER_PORT 8888                   //服務器端端口號#define CLI_IP "192.168.199.131"        //客戶端IP
#define CLI_PORT 9999                   //客戶端端口號
/**********************TCP客戶端********************/
int main(int argc, const char *argv[])
{//1.創建用于通信的套接字int cfd=-1;if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.綁定服務器IP地址和端口號(非必須)//2.1填充地址信息結構體struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);//2.2綁定if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");}printf("bind success\n");//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);//3.2連接到服務器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}//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);      getchar();             //吸收垃圾字符switch(key){case 'W':case 'w':{rbuf[3]+=3;        //紅色機械臂每次增加3度if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);   //將鍵盤控制的結果發送到服務器端}break;case 'S':case 's':{rbuf[3]-=3;         //紅色機械臂每次減少3度if(rbuf[3]<=-90){rbuf[3]=-90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case 'D':case 'd':{bbuf[3]+=3;        //藍色機械臂每次增加3度if(bbuf[3]>=180){bbuf[3]=180;}send(cfd,bbuf,sizeof(bbuf),0);}break;case 'A':case 'a':{bbuf[3]+=3;        //藍色機械臂每次減少3度if(bbuf[3]<=0){bbuf[3]=0;}send(cfd,bbuf,sizeof(bbuf),0);}break;default:printf("error\n");break;}}//5.關閉套接字close(cfd);return 0;
}

效果圖:

二、基于UDP的TFTP文件傳輸

代碼:

#include <myhead.h>
#define SER_IP "192.168.125.254"        //服務端IP
#define SER_PORE 69                     //TFTP協議使用的端口號//定義下載請求
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;
}/*******************UDP客戶端********************/
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.下載********\t\n");printf("\t*********2.上傳********\t\n");printf("\t*********3.退出********\t\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("error\n");break;}}END://3.關閉套接字close(cfd);return 0;
}

效果圖:

下載文件:

?

上傳文件:

思維導圖:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716280.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

100條數據秒殺,如何避免超賣【待補充更細的資料】

使用Redis預減庫存&#xff1a;利用Redis的原子性操作&#xff0c;如DECR命令&#xff0c;來預先減少庫存。當商品庫存數量在Redis中被減少到0時&#xff0c;后續的請求將被拒絕&#xff0c;從而確保只有限定數量的訂單能夠進入后續流程。悲觀鎖&#xff1a;在數據庫層面使用悲…

面試筆記系列八之JVM基礎知識點整理及常見面試題

目錄 類實例化加載順序 類的實例化順序 JVM創建對象的過程 JVM的運行機制 直接內存&#xff08;Direct Memory&#xff09; JVM后臺運行的線程 JVM 常用參數 標準參數中比較有用的&#xff1a; 非標準參數又稱為擴展參數&#xff0c;比較有用的是 非Stable參數 class初…

【DAY07 軟考中級備考筆記】數據結構:線性結構,數組矩陣和廣義表

數據結構&#xff1a;線性結構&#xff0c;數組矩陣和廣義表 3月2日 – 天氣&#xff1a;晴 1. 線性表的定義和存儲方式 > 這一部分只需要掌握下面的兩點即可&#xff1a; > > * 采用順序存儲和鏈式存儲的特點 > * 單鏈表的插入和刪除操作 2. 棧和隊列 > 這里需…

35 Spring整合Elasticsearch

文章目錄 Spring整合Elasticsearch引入依賴配置Elasticsearch解決沖突 使用ElasticsearchSpring Data Elasticsearch建立映射關系常用方法添加數據修改數據刪除數據搜索數據&#xff08;es核心&#xff09;步驟構造搜索條件 并 應用進行查詢使用查詢結果 Spring整合Elasticsear…

Spring注解之事務 @Transactional

目錄 Spring 對事務的支持 事務 Transactional Spring 對事務的支持 提醒一次&#xff1a;你的程序是否支持事務首先取決于數據庫 &#xff0c;比如使用 MySQL 的話&#xff0c;如果你選擇的是 innodb 引擎&#xff0c;那么恭喜你&#xff0c;是可以支持事務的。但是&#x…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:Popup控制)

給組件綁定popup彈窗&#xff0c;并設置彈窗內容&#xff0c;交互邏輯和顯示狀態。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 popup彈窗的顯示狀態在onStateChange事件回調中反饋&#xff0c;其顯…

opencv內存溢出del釋放變量 (python)

報錯&#xff1a; cv2.error: OpenCV(3.4.17) D:\a\opencv-python\opencv-python\opencv\modules\core\src\alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 12211548 bytes in function ‘cv::OutOfMemoryError’ 檢查內存代碼 import psutil# 獲取當前進…

內存空間擔保機制

什么是內存空間擔保機制&#xff1f; 內存空間擔保機制&#xff08;Memory Space Guarantee&#xff09;是垃圾回收&#xff08;Garbage Collection&#xff09;算法中的一種策略。它用于在進行垃圾回收過程&#xff08;如Minor GC或Full GC&#xff09;時&#xff0c;確保老年…

Java項目layui分頁中文亂碼

【問題描述】這部分沒改之前中文亂碼。 【解決辦法】在layui.js或者layui.all.js文件中替換共、頁、條轉換成Unicode碼格式。 字符Unicode共&#x5171頁&#x9875條&#x6761【完美解決】改完之后重新運行項目&#xff0c;瀏覽器F12緩存清除就好了&#xff0c;右鍵

MySQL的單表和多表查詢

我們在前面曾構建過三個用于實驗的表格&#xff0c;下面將基于這三個表進行實踐。 # 建立一個用于實驗的三個表格 mysql> create table emp (-> empno varchar(10),-> ename varchar(50),-> job varchar(50),-> mgr int,-> hiredate timestamp,-&…

課程表系列(BFS)

廣度優先搜索 文章目錄 廣度優先搜索207. 課程表210. 課程表 II思路 630. 課程表 III1462. 課程表 IV547. 省份數量 207. 課程表 207. 課程表 你這個學期必須選修 numCourses 門課程&#xff0c;記為 0 到 numCourses - 1 。 在選修某些課程之前需要一些先修課程。 先修課程…

c++11 標準模板(STL)(std::tuple)(三)

定義于頭文件 <tuple> template< class... Types > class tuple; (C11 起) 類模板 std::tuple 是固定大小的異類值匯集。它是 std::pair 的推廣。 若 (std::is_trivially_destructible_v<Types> && ...) 為 true &#xff0c;則 tuple 的析構函數是…

【AI繪畫】免費GPU Tesla A100 32G算力部署Stable Diffusion

免責聲明 在閱讀和實踐本文提供的內容之前&#xff0c;請注意以下免責聲明&#xff1a; 侵權問題: 本文提供的信息僅供學習參考&#xff0c;不用做任何商業用途&#xff0c;如造成侵權&#xff0c;請私信我&#xff0c;我會立即刪除&#xff0c;作者不對讀者因使用本文所述方法…

Matlab 機器人工具箱 RobotArm類

文章目錄 1 RobotArm1.1 方法1.2 注意2 RobotArm.RobotArm3 RobotArm.cmove4 其他官網:Robotics Toolbox - Peter Corke 1 RobotArm 串聯機械臂類 1.1 方法 方法描述plot顯示機器人的圖形表示teach驅動物理和圖形機器人mirror使用機器人作為從機來驅動圖形</

深入了解Kafka的文件存儲原理

Kafka簡介 Kafka最初由Linkedin公司開發的分布式、分區的、多副本的、多訂閱者的消息系統。它提供了類似于JMS的特性&#xff0c;但是在設計實現上完全不同&#xff0c;此外它并不是JMS規范的實現。kafka對消息保存是根據Topic進行歸類&#xff0c;發送消息者稱為Producer&…

IntelliJ IDEA 常用的插件

IntelliJ IDEA有很多常用的插件&#xff0c;這些插件可以擴展IDE的功能&#xff0c;提高開發效率。以下是一些常用的插件&#xff1a; Maven Helper&#xff1a;這是一款分析Maven依賴沖突的插件。在沒有此插件時&#xff0c;查看Maven的依賴樹和檢查依賴包沖突可能需要輸入命…

梯度下降算法(帶你 原理 實踐)

目錄 一、引言 二、梯度下降算法的原理 三、梯度下降算法的實現 四、梯度下降算法的優缺點 優點&#xff1a; 缺點&#xff1a; 五、梯度下降算法的改進策略 1 隨機梯度下降&#xff08;Stochastic Gradient Descent, SGD&#xff09; 2 批量梯度下降&#xff08;Batch…

LLM分布式訓練第一課(通訊原語)

這個系列作為TFLOPS和顯存消耗的續篇,今天開始正式連載 上一部地址: LLM 參數,顯存,Tflops? 訓練篇(5) (qq.com) 前一篇文章舉了65B模型的訓練所消耗的顯存的案例,如果把條件降低一點,我們看一下7B的模型需要多少顯存? 2byte的模型靜態參數權重(以16bit存儲) = 1…

(一)Python數據分析體系--九五小龐

課程地址&#xff1a;https://space.bilibili.com/387143299/channel/collectiondetail?sid554734 主要內容 知識體系 分析什么樣的數據 為什么使用Python做數據分析 Python近幾年的發展勢頭是有目共睹的&#xff0c;尤其是在科學計算&#xff0c;數據處理&#xff0c;A方面…

駕辰龍跨Llama持Wasm,玩轉Yi模型迎新春

今年新年很特別&#xff0c;AI工具添光彩。今天就來感受下最新的AI神器天選組合“WasmEdgeYi-34B”&#xff0c;只要短短三步&#xff0c;為這個甲辰龍年帶來一份九紫離火運的科技感。 環境準備 這次用的算力是OpenBayes提供的英偉達RTX_4090*1、24GB顯存、20核CPU、80GB內存…