機械臂與tftp

機械臂:?

#include<myhead.h>
#define SER_IP "192.168.126.2"
#define SER_PORT 8888#define CLI_IP "192.168.252.165"
#define CLI_PORT 9999int main(int argc, const char *argv[])
{int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd==-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;}printf("connect success\n");struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}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);fflush;switch(key){case'W':case'w':{rbuf[3]+=2;if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case's':case'S':{rbuf[3]=rbuf[3]-2;if(rbuf[3]<=-90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case'd':case'D':{bbuf[3]+=2;if(bbuf[3]>=180){bbuf[3]=180;}send(cfd,bbuf,sizeof(bbuf),0);}break;case'a':case'A':{bbuf[3]=bbuf[3]-2;if(bbuf[3]>=180){bbuf[3]=0;}}break;}}close(cfd);return 0;
}

tftp:

#include <myhead.h>
#define IP "192.168.126.2"
#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/717406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717406.shtml

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

相關文章

支持向量機 SVM | 線性可分:公式推導

目錄 一. SVM的優越性二. SVM算法推導小節概念 在開始講述SVM算法之前&#xff0c;我們先來看一段定義&#xff1a; 支持向量機(Support VecorMachine, SVM)本身是一個二元分類算法&#xff0c;支持線性分類和非線性分類的分類應用&#xff0c;同時通過OvR或者OvO的方式可以應用…

安裝Docker及DockerCompose

0.安裝Docker Docker 分為 CE 和 EE 兩大版本。CE 即社區版&#xff08;免費&#xff0c;支持周期 7 個月&#xff09;&#xff0c;EE 即企業版&#xff0c;強調安全&#xff0c;付費使用&#xff0c;支持周期 24 個月。 Docker CE 分為 stable test 和 nightly 三個更新頻道…

10.輪廓系數-機器學習模型性能的常用的評估指標

輪廓系數&#xff08;Silhouette Coefficient&#xff09;是評估聚類算法效果的常用指標之一。它結合了聚類的凝聚度&#xff08;Cohesion&#xff09;和分離度&#xff08;Separation&#xff09;&#xff0c;能夠量化聚類結果的緊密度和分離度。 背景 1.聚類分析的背景 在…

NDK介紹

NDK&#xff08;Native Development Kit&#xff09;是一個用于在Android平臺上開發C和C代碼的工具集。它允許開發人員使用C和C編寫部分代碼&#xff0c;并將其編譯為本機代碼庫&#xff08;.so文件&#xff09;&#xff0c;然后通過JNI在Java應用程序中調用這些本地代碼。 ND…

CUDA學習筆記01:vs2019環境配置

為了在window11 vs2019下使用CUDA編程&#xff0c;配置了一下環境&#xff0c;但是我電腦一開始自帶CUDA&#xff0c;然后再安裝的vs2019&#xff0c;這樣安裝順序上是不對的&#xff0c;vs2019找不到CUDA配置項&#xff0c;網上找了很多辦法貌似都不好使而且很復雜。 那么最快…

c++之拷貝構造和賦值

如果一個構造函數中的第一個參數是類本身的引用&#xff0c;或者是其他的參數都有默認值&#xff0c;則該構造函數為拷貝構造函數。 那么什么是拷貝構造呢&#xff1f;利用同類對象構造一個新對象。 1&#xff0c;函數名和類必須同名。 2&#xff0c;沒有返回值。 3&#x…

Linux多線程控制:深入理解與應用(萬字詳解!)

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;どうして (feat. 野田愛実) 0:44━━━━━━?&#x1f49f;──────── 3:01 &#x1f504; ?? ? ?? …

6.2 指標的應用與設計(12%)

1、指標的作用 用簡約的匯總數據量化業務強弱。 2、指標的理解 特點&#xff1a; &#xff08;1&#xff09;指標是游離態的&#xff0c;無法單獨實現數據統計 eg&#xff1a;總銷售額、總銷售量 &#xff08;2&#xff09;需與統計維度結合&#xff0c;明確統計指標的對…

帕累托優化基本概念,如何系統學習?

帕累托優化&#xff0c;也稱為帕累托改善或帕累托改進&#xff0c;是以意大利經濟學家帕累托&#xff08;Vilfredo Pareto&#xff09;命名的。它的基本概念是在沒有使任何人境況變壞的前提下&#xff0c;使得至少一個人變得更好。帕累托最優是指沒有進行帕累托改進余地的狀態&…

047 內部類

成員內部類用法 /*** 成員內部類** author Admin*/ public class OuterClass {public void say(){System.out.println("這是類的方法");}class InnerClass{public void say(){System.out.println("這是成員內部類的方法");}}public static void main(Stri…

(二)邏輯回歸與交叉熵--九五小龐

什么是邏輯回歸 線性回歸預測的是一個連續值&#xff0c;邏輯回歸給出的“是”和“否”的回答 Singmoid sigmoid函數是一個概率分布函數&#xff0c;給定某個輸入&#xff0c;它將輸出為一個概率值 邏輯回歸損失函數 平方差所懲罰的是與損失為同一數量級的情形&#xff0…

Springboot企業級開發--1.開發入門

目錄 目錄 一.Spring Boot的主要特點和優勢包括&#xff1a; 二.Spring Boot的核心功能可以歸納為以下幾點&#xff1a; 三.Springboot是如何解決問題&#xff1f; Spring Boot 是一個開源的Java框架&#xff0c;其設計目標是為了簡化新Spring應用的初始搭建以及開發過程。…

SandBox中的JavaAgent技術

8.1 JavaAgent Java Agent 是一種強大的技術&#xff0c;在運行時動態修改已加載類的字節碼&#xff0c;為應用程序注入額外的功能和行為。 JDK 1.5 支持靜態 Instrumentation&#xff0c;基本的思路是在 JVM 啟動的時候添加一個代理&#xff08;javaagent&#xff09;&#…

基于阿里云OSS上傳圖片實戰案例

一、案例描述 基于Springboot框架實現一個上傳圖片到阿里云服務端保存的小案例。 二、準備工作 基于Springboot免費搭載輕量級阿里云OSS數據存儲庫&#xff08;將本地文本、照片、視頻、音頻等上傳云服務保存&#xff09;-CSDN博客 三、代碼 新建這兩個類&#xff1a;一個…

Golang函數make介紹和用法

1.介紹 golang分配內存主要有內置函數new和make 相同點: 他們的第一個參數都是一個類型而不是一個值 不同點: new可分配任意類型的數據make只能為slice, map, channel分配內存new返回的是指針make返回類型的是引用而不是指針,并且返回的值也依賴于具體傳入的類型, 這種不同點的…

C++原子操作

8.3.5 原子操作 在同一時刻只有唯一的線程對這個資源進行訪問。這有點類似互斥對象對共享資源的訪問的保護&#xff0c;但是原子操作更加接近底層&#xff0c;因而效率更高。 &#xff08;1&#xff09;pthread #include <stdatomic.h> atomic_int atomicVariable; at…

Python如何從SQL Server存取數據?

在Python中&#xff0c;你可以使用各種庫來連接和操作 SQL Server 數據庫。一種常用的庫是pyodbc&#xff0c;它是一個用于連接到各種數據庫的開源 Python 庫&#xff0c;包括 SQL Server。以下是連接到 SQL Server 并存取數據的基本步驟&#xff1a; 1、安裝 pyodbc 庫&#…

LANA: A Language-Capable Navigator for Instruction Following and Generation

摘要 最近&#xff0c;視覺語言導航&#xff08;VLN&#xff09;——要求機器人代理遵循導航指令——已經取得了巨大的進步。然而&#xff0c;現有文獻最強調將指令解釋為行動&#xff0c;只提供“愚蠢”的尋路代理。在本文中&#xff0c;我們設計了 LANA&#xff0c;一種支持…

【C++ 異常處理】

C 異常處理 ■ C 異常處理簡介■ throw (拋出異常)■ catch (捕獲異常)■ try&#xff08;&#xff09;■ C 標準的異常 ■ C 異常處理簡介 C 異常處理涉及到三個關鍵字&#xff1a;try、catch、throw。 屬性描述throw當問題出現時&#xff0c;程序會拋出一個異常。這是通過使…

【LeetCode-1143】最長公共子序列(動歸)

目錄 題目描述 解法1&#xff1a;動態規劃 代碼實現 題目鏈接 題目描述 給定兩個字符串 text1 和 text2&#xff0c;返回這兩個字符串的最長公共子序列的長度。 一個字符串的 子序列 是指這樣一個新的字符串&#xff1a;它是由原字符串在不改變字符的相對順序的情況下刪除…