關于機械臂的控制和基于tftp文件的上傳和下載功能的實現

1、TCP客戶端控制機械臂代碼實現:

#include <myhead.h>
#define IP "192.168.126.58"
#define PORT 8888#define CLI_IP "192.168.126.91"  //客戶端IP
#define CLI_PORT 6666  //客戶端端口號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);//綁定struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}//連接服務器//填充要連接的服務器地址信息結構體struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");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){printf("請輸入key的值>>>");scanf("%c",&key);getchar();switch(key){case 'w':case 'W':rbuf[3]+=3;if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);break;case 's':case 'S':rbuf[3]-=3;if(rbuf[3]<=-90){rbuf[3]=-90;}send(cfd,rbuf,sizeof(rbuf),0);break;case 'd':case 'D':bbuf[3]+=3;if(bbuf[3]>=180){bbuf[3]=180;}send(cfd,bbuf,sizeof(bbuf),0);break;case 'A':case 'a':bbuf[3]-=3;if(bbuf[3]<=0){bbuf[3]=0;}send(cfd,bbuf,sizeof(bbuf),0);break;default:printf("輸入錯誤,請重新輸入!!!\n");}}//關閉套接字close(cfd);return 0;
}

2、tftp實現文件的上傳和下載

#include <myhead.h>
#define IP "192.168.126.47"
#define PORT 69//定義下載函數
int do_download(int sfd,struct sockaddr_in sin)
{char pack[516]=""; //組件協議包:下載請求short *p1=pack;*p1=htons(1);    //設置操作碼char *p2=pack+2;char filename[40]="";printf("請輸入要下載的文件名>>>");fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;strcpy(p2,filename);char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");       //模式位int packlen=4+strlen(p2)+strlen(p4);   //請求包的大小//向服務器發送請求包if(sendto(sfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}printf("請求成功\n");//收取服務器發來的數據包char rbuf[516]="";short *r1=rbuf;//創建一個文件int fd=-1;if((fd=open(filename,O_RDWR|O_CREAT|O_TRUNC,0664))==-1){perror("open error");return -1;}printf("fd=%d\n",fd);socklen_t socklen=sizeof(sin);while(1){//	printf("111\n");bzero(rbuf,sizeof(rbuf));int res=recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,&socklen);if(*r1==ntohs(3)){if(write(fd,rbuf+4,res-4)<0){perror("write error");break;}*r1=htons(4);if(sendto(sfd,rbuf,4,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}if(res<516){printf("下載完畢\n");break;}else if(rbuf[1]==5){printf("download error:%s\n",rbuf+4);}}}close(fd);return 0;//如果為512,則讀取后,回復一個應打包,繼續接收下一個//如果小于512,則讀取數據后,回復一個應打包,結束接收數據	}//定義上傳函數
int do_upload(int sfd,struct sockaddr_in sin)
{char pack[516]=""; //組件協議包:上傳請求short *p1=pack;*p1=htons(2);    //設置操作碼char *p2=pack+2;char filename[40]="";printf("請輸入要上傳的文件名>>>");fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;strcpy(p2,filename);char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");       //模式位int packlen=4+strlen(p2)+strlen(p4);   //請求包的大小//向服務器發送請求包if(sendto(sfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}printf("請求成功\n");//從linux系統中讀取文件,然后發送給服務器//以只讀的形式打開上傳的文件int fd1=-1;if((fd1=open(filename,O_RDWR))==-1){perror("open error");return -1;}printf("fd1=%d\n",fd1);socklen_t socklen=sizeof(sin);//用來讀取文件的容器char rbuf[516]="";short *r1=rbuf;      //操作碼short *r2=rbuf+2;    //塊編號int i=1;int len=0;         //讀取文件的大小while(1){bzero(rbuf,sizeof(rbuf));int res=recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,&socklen);if(*r1==ntohs(4)){bzero(rbuf,sizeof(rbuf));len=read(fd1,rbuf+4,512);	*r2=htons(i);    //給塊編號賦值//把讀取文件的內容發送給服務器*r1=htons(3);   //給操作碼賦值if(sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,socklen)==-1){perror("sendto error");return -1;}i++;if(len<512){printf("上傳完畢\n");break;}else if(rbuf[1]==5){printf("upload error:%s\n",rbuf+4);}}}close(fd1);return 0;}int main(int argc, const char *argv[])
{int sfd=-1;if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);socklen_t socklen=sizeof(sin);int menu=0;while(1){	system("clear");printf("****************\n");printf("*****1.下載*****\n");printf("*****2.上傳*****\n");printf("*****3.退出*****\n");printf("****************\n");printf("請輸入選項:");scanf("%d",&menu);getchar();//對菜單多分支選擇switch(menu){case 1:{//下載功能do_download(sfd,sin);}break;case 2:{//上傳功能do_upload(sfd,sin);}break;case 3:goto END;break;default:printf("輸入錯誤,請重新輸入\n");}printf("請輸入任意鍵按回車結束\n");while(getchar()!='\n');}END:	close(sfd);return 0;
}

運行結果:

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

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

相關文章

【AI Agent系列】【MetaGPT多智能體學習】3. 開發一個簡單的多智能體系統,兼看MetaGPT多智能體運行機制

本系列文章跟隨《MetaGPT多智能體課程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并實踐多智能體系統的開發。 本文為該課程的第四章&#xff08;多智能體開發&#xff09;的第一篇筆記。主要記錄下多智能體的運行…

rsyslog配置中支持的模塊

rsyslog 配置語法 官方文檔 支持的模塊 rsyslog包含了很多模塊,主要分為輸入模塊、輸出模塊等等。 下面是關于 rsyslog 支持的大的模塊分類及其作用的說明: 模塊分類作用代表模塊鏈接Output Modules用于將日志消息輸出到不同的目的地omfile - 將日志消息輸出到文件omstdou…

CF 1867B

代碼 #include<bits/stdc.h>using namespace std;const int N1e510;int ans[N];void solve() {//輸入字符串長度和字符串int n;string s;cin>>n>>s;//下面說的修改操作是進行異或操作//k表示前后對稱位置不相等的字符的對數//m表示前后對稱位置相等的字符的…

C/C++基礎語法

C/C基礎語法 文章目錄 C/C基礎語法頭文件經典問題鏈表鏈表基礎操作 秒數轉換閏年斐波那契數列打印n階菱形曼哈頓距離菱形圖案的定義大數計算 輸入輸出格式化輸入輸出getline()函數解決cin只讀入一個單詞的問題fgets讀入整行輸出字符數組&#xff08;兩種方式puts和printf&#…

Linux或Windows下判斷socket連接狀態

前言 場景&#xff1a;客戶端程序需要實時知道和服務器的連接狀態。比較通用的做法應用層是采用心跳機制&#xff0c;每隔一端時間發送心跳能回復說明服務器正常。 實際應用場景中&#xff0c;服務端和客戶端并不是一家廠商的&#xff0c;比如說筆者這種情況&#xff0c;服務端…

推特API(Twitter API)V2 查詢用戶信息

前面章節已經介紹使用code換取Token的整個流程了&#xff0c;這里不再重復闡述了&#xff0c;下面我們介紹如何使用Token查詢用戶信息等操作。 1.引入相關依賴Maven <dependency> <groupId>oauth.signpost</groupId> <artifactId>signpost-co…

二刷代碼隨想錄——貪心day34

文章目錄 前言貪心知識點貪心的套路 貪心一般解題步驟一、860. 檸檬水找零二、406. 根據身高重建隊列三、452. 用最少數量的箭引爆氣球總結 前言 一個本碩雙非的小菜雞&#xff0c;備戰24年秋招&#xff0c;計劃二刷完卡子哥的刷題計劃&#xff0c;加油&#xff01; 二刷決定精…

day10_oop

今日內容 零、 復習昨日 一、作業 二、繼承 三、重寫 四、this和super 五、訪問修飾符 零、 復習昨日 數組創建的兩種方式 new int[3];new int[]{值,值2,…}存值: 數組名[下標] 值 構造方法什么作用?有參無參構造什么區別? 創建對象無參創建出的對象屬性是默認值有參創建出的…

【力扣白嫖日記】602.好友申請II:誰有最多的好友

前言 練習sql語句&#xff0c;所有題目來自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免費數據庫練習題。 今日題目&#xff1a; 602.好友申請II&#xff1a;誰有最多的好友 表&#xff1a;RequestAccepted 列名類型requester_idintaccept…

外賣店優先級

題目描述 ”飽了么”外賣系統中維護著N 家外賣店&#xff0c;編號1~N。每家外賣店都有一個優先級&#xff0c;初始時(0時刻)優先級都為0。 每經過1個時間單位&#xff0c;如果外賣店沒有訂單&#xff0c;則優先級會減少1&#xff0c;最低減到0;而如果外賣店有訂單&#xff0c;則…

【AIGC】微笑的秘密花園:紅玫瑰與少女的美好相遇

在這個迷人的畫面中&#xff0c;我們目睹了一個迷人的時刻&#xff0c;女子則擁有一頭柔順亮麗的秀發&#xff0c;明亮的眼睛如同星河般璀璨&#xff0c;優雅而靈動&#xff0c;她的微笑如春日暖陽&#xff0c;溫暖而又迷人。站在紅玫瑰花瓣的驚人洪水中。 在一片湛藍無云的晴…

Liberod的License申請

Liberod的License申請 找到license申請的路徑 查找C盤的磁盤序列號 鍵盤的win+R,輸入cmd 輸入vol,然后回車 圖中的DiskID就是填寫你C盤序列號的位置,填寫完成后點擊Register,幾秒鐘后會提示你,預計45分鐘后會發送到你的郵箱

docker-mysql:5.7安裝

1、下載mysql:5.7鏡像 [rootlocalhost ~]# docker search mysql (某個XXX鏡像名字) [rootlocalhost ~]# docker pull mysql:5.7 按裝之前查看一下是否按裝過mysql。如果安裝過會占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、安裝 # -d&#xff1a;后臺運行 #…

C語言基礎(五)——結構體與C++引用

七、結構體與C引用 7.1 結構體的定義、初始化、結構體數組 C 語言提供結構體來管理不同類型的數據組合。通過將不同類型的數據組合成一個整體&#xff0c;方便引用 例如&#xff0c;一名學生有學號、姓 名、性別、年齡、地址等屬性&#xff0c;如果針對學生的學號、姓名、年齡…

MJ V7 在 V6 Beta 發布后即將推出,即將到來的人工智能 API 訪問!

讓我們深入了解 MidJourney 的新功能 在發布官方 Beta 之前總結 V6 Alpha 隨著 MidJourney V6 Alpha 上周成為默認版本&#xff0c;該團隊現在正在努力在過渡到官方 Beta 版本之前進行進一步的改進&#xff1a; 一組 3 個視覺一致性功能 1 — 升級的“風格參考”功能 這將是…

團體程序設計天梯賽 L2-003 月餅(多重背包模板)

L2-003 月餅 分數 25 月餅是中國人在中秋佳節時吃的一種傳統食品&#xff0c;不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量&#xff0c;請你計算可以獲得的最大收益是多少。 注意&#xff1a;銷售時允許取出一部分庫存。樣例給…

pytorch基礎1-pytorch介紹與張量操作

專題鏈接&#xff1a;https://blog.csdn.net/qq_33345365/category_12591348.html 本教程翻譯自微軟教程&#xff1a;https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/ 初次編輯&#xff1a;2024/3/1&#xff1b;最后編輯&#xff1a;2024/3/1 這是本…

高中數學:分式函數值域的求法

一、求值域的兩種基本思路 1、根據函數圖像和定義域求出值域。 難點&#xff1a;畫出函數圖像 2、研究函數單調性和定義域求出值域。 二、函數圖像畫法 高中所學的分式函數&#xff0c;基本由反比例函數平移得到。 復雜分式函數圖像畫法的兩個要點&#xff1a; a、找垂直、…

mysql 常用命令練習

管理表格從表中查詢數據從多個表查詢修改數據sql變量類型 管理表格 創建一個包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 從數據庫中刪除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

如何優化阿里云幻獸帕魯/Palworld的多人聯機性能,并避免內存溢出導致的異常退出游戲?

優化阿里云幻獸帕魯/Palworld的多人聯機性能并避免內存溢出導致的異常退出游戲&#xff0c;可以采取以下幾種方法&#xff1a; 選擇合適的內存配置&#xff1a;由于幻獸帕魯是一個對內存需求較高的游戲&#xff0c;建議選擇至少16GB的內存。對于不同的玩家數量&#xff0c;可以…