基于UDP的TFTP文件傳輸-實現網盤上傳下載功能

數據傳輸模式:octet(二進制模式)

#include<head.h>
char* down_up_request(char* buf,char* filename,int rw,int sockfd,struct sockaddr_in in);
int download(struct sockaddr_in in,char* filename,char* buf,int sockfd);
int upload(struct sockaddr_in in,char* filename,char* buf,int sockfd);
int main(int argc, const char *argv[])
{/***********************************基于UDF的TFTP文件傳輸,實現網盤功能***********************************//**********客戶端代碼**************///創建套接文件int rtsocket=socket(AF_INET,SOCK_DGRAM,0);if(rtsocket==-1){perror("socket");return -1;}else{printf("套接文件創建成功\n");}//綁定客戶端端口與IPstruct sockaddr_in cin;char* cip="192.168.176.130";uint16_t cport=8888;cin.sin_family=AF_INET;cin.sin_port=htons(cport);cin.sin_addr.s_addr=inet_addr(cip);int rtbind=bind(rtsocket,(struct sockaddr*)&cin,sizeof(cin));if(rtbind==0){printf("與客戶端綁定成功\n");}else if(rtbind==-1){perror("bind");return -1;}//數據收發/*填充服務器地址與端口信息*/struct sockaddr_in sin;char* sip="192.168.118.161";uint16_t sport=69;sin.sin_family=AF_INET;sin.sin_port=htons(sport);sin.sin_addr.s_addr=inet_addr(sip);/*********************************/char data[516]={0};char filename[128]={0};printf("*******1<download>*******\n");printf("*******2<upload>*********\n");printf("*******3<exit>***********\n");while(1){int option=0;printf("please choose option:");scanf("%d",&option);if(option<1&&option>3){printf("enter error,please reenter\n");scanf("%d",&option);}switch(option){case 1 :{printf("please enter download filename:");scanf("%s",filename);getchar();char* rt=down_up_request(data,filename,1,rtsocket,sin);download(sin,filename,rt,rtsocket);}break;case 2:{printf("please enter upload filename:");scanf("%s",filename);getchar();char* rt=down_up_request(data,filename,2,rtsocket,sin);upload(sin,filename,rt,rtsocket);}break;case 3: {goto END;}break;}}
END:close(rtsocket);return 0;
}
//下載或上傳請求
char* down_up_request(char* buf,char* filename,int rw,int sockfd,struct sockaddr_in in){short* p1=(short*)buf;*p1=htons(rw);//rw操作碼轉為網絡字節序char* p2=buf+2;strcpy(p2,filename);//存入要下載的文件名char* p3=p2+strlen(p2)+1;strcpy(p3,"octet");//設置操作模式int size=2+sizeof(p2)+1+sizeof(p3)+1;ssize_t rtsendto=sendto(sockfd,buf,size,0,(struct sockaddr*)&in,sizeof(in));if(rtsendto==-1){perror("sendto");return NULL;}else{printf("發送請求成功\n");}return buf;
}
//下載
int download(struct sockaddr_in in,char* filename,char* buf,int sockfd){int fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd==-1){perror("open");return -1;}short num=0;socklen_t addrlen=sizeof(in);while(1){bzero(buf,sizeof(buf));ssize_t rtrecvfrom=recvfrom(sockfd,buf,516,0,(struct sockaddr*)&in,&addrlen);//循環接收數據if(rtrecvfrom==-1){perror("recvfrom");return -1;}else{printf("reading......\n");}if(buf[1]==3){//判斷是否是數據包if(*(short*)(buf+2)==htons(num+1)){//確認塊編號接發是否一致num++;if(rtrecvfrom-4==512){//數據包后512字節為數據ssize_t rtwrite=write(fd,buf+4,rtrecvfrom-4);if(rtwrite<0){printf("write error\n");break;}}char ACK[4]={0};short *p=(short*)ACK;*p=htons(4);short *p1=(short*)(ACK+2);*p1=htons(num);ssize_t rtsendto=sendto(sockfd,ACK,4,0,(struct sockaddr*)&in,addrlen);//寫入成功,向服務器發送ACK,確認if(rtsendto==-1){perror("sendto");return -1;}if(rtrecvfrom<516){//讀取小于516說明已經讀取結束ssize_t rtwrite=write(fd,buf+4,rtrecvfrom-4);if(rtwrite<0){printf("write error\n");break;}printf("end of download\n"); close(fd);  break;}}} else if(buf[1]==5){ //錯誤信息printf("error:%s\n",buf+4);close(fd);return -1;}}
}
//上傳
int upload(struct sockaddr_in in,char* filename,char* buf,int sockfd){int fd=open(filename,O_RDONLY);if(fd==-1){printf("file don't exist\n");return -1;}short num=0;socklen_t addrlen=sizeof(in);while(1){bzero(buf,sizeof(buf));ssize_t rtrecvfrom=recvfrom(sockfd,buf,4,0,(struct sockaddr*)&in,&addrlen);//循環接收服務器確認消息if(rtrecvfrom==-1){perror("recvfrom");return -1;}else{printf("ready upload....\n");}//	printf("ACK=%d\n",ntohs(*(short*)(buf+2)));//查看第一次發過來的ack//	解析服務器數據,讀取并發送數據包給服務器if(buf[1]==4){//判斷服務器是否發來ACKif(*(short*)(buf+2)==htons(num)){//確認塊編號接發是否一致,從0開始ssize_t rtread=read(fd,buf+4,512);printf("uploading.......\n");//	printf("rtread=%ld\n",rtread);short *p=(short*)buf;*p=htons(3);//修改為數據包,服務器識別數據包下載數據num++;//ACK塊編碼確認+1給服務器確認short *p1=(short*)(buf+2);*p1=htons(num);ssize_t rtsendto=sendto(sockfd,buf,rtread+4,0,(struct sockaddr*)&in,addrlen);//將上傳的文件以每512字節發送給服務器,并發送ACK確認if(rtsendto==-1){perror("sendto");return -1;}if(rtread<512){//讀取小于512說明上傳的文件已經讀取完畢printf("upload success\n");close(fd);break;}}}else if(buf[1]==5){ //錯誤信息printf("error:%s\n",buf+4);close(fd);return -1;}}
}

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

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

相關文章

Flask教程4:Flask數據交互

文章目錄 使用flask處理表單flash閃現的使用Flask實現文件上傳Session的使用為什么session比cookie安全?設置session獲取session的值刪除session的值或清空session所有內容 使用flask處理表單 傳統的前端通用表單&#xff0c;需要前后端共同完成操作&#xff0c;前端需要使用…

百川大模型拿下國產第一,AI助手「百小應」上線,比Kimi強不少

最近幾天&#xff0c;國內 AI 創業公司正在連續刷新大模型的能力上限。 5 月 22 日&#xff0c;百川智能發布最新一代基座大模型 Baichuan 4&#xff0c;同時推出了首款 AI 助手「百小應」。 相較 1 月份發布的 Baichuan 3&#xff0c;新一代模型在各項能力上均有大幅提升&am…

如何與“病態”的人建立友誼:一種基于理解與接納的視角

在我們的生活中&#xff0c;我們經常會遇到一些行為舉止讓我們感到不適或難以理解的人。這些人可能因為他們的某些行為被標簽為“病態”&#xff0c;但真的應該如此簡單地對他們進行評判嗎&#xff1f;本文將探討如何與被視為“病態”的人建立友誼&#xff0c;以及為什么這種接…

分塊優化思想

適用場景 將長區間&#xff08;n&#xff09;的順序枚舉查詢優化至 n \sqrt{n} n ?個塊的順序枚舉&#xff0c;這樣單次查詢枚舉的數量會直接從O&#xff08;n&#xff09;降低至O&#xff08; n \sqrt{n} n ?&#xff09;。 實現手段&#xff1a; &#xff08;1&#xff09…

【云擎未來,智信天下】移動云服務器Docker部署+遠程連接Redis

文章目錄 引言&#xff1a; 移動云&#xff1a;云擎未來&#xff0c;智信天下一、什么是Redis&#xff1f;二、Redis 與其他 key-value 存儲有什么不同&#xff1f;Redis 架構 三、環境準備四、部署流程使用Redis Desktop Manager遠程連接操作數據庫總結與未來展望云擎未來&…

安卓Bug總結

為什么寫這篇文章 安卓十年開發遇到過得Bug做一個總結&#xff0c;大同小異&#xff0c;總結教訓。 這里存放BUG目錄列表 文章列表內容關鍵字Gradle常見問題及總結包括以下問題&#xff1a;gradle插件與gradle home版本關系錯誤、Gradle下載太慢、Executionfailed forJetifyTr…

java nio FileChannel堆內堆外數據讀寫全流程分析及使用(附詳細流程圖)

這里是小奏,覺得文章不錯可以關注公眾號小奏技術 背景 java nio中文件讀寫不管是普通文件讀寫&#xff0c;還是基于mmap實現零拷貝&#xff0c;都離不開FileChannel這個類。 隨便打開RocketMQ 源碼搜索FileChannel 就可以看到使用頻率 kafka也是 所以在java中文件讀寫FileCh…

CRC校驗(循環冗余校驗 Cyclic Redundancy Check)(以Modbus通信為例)

文章目錄 CRC校驗在Modbus通信中的應用介紹CRC校驗的基本原理校驗原理核心多項式 CRC在Modbus通信中的實際應用數據格式校驗流程1. 發送方&#xff1a;計算數據包&#xff08;不包括CRC校驗碼&#xff09;的CRC校驗碼&#xff0c;然后將校驗碼附加到數據包的末尾。2. 接收方&am…

集合的概述

java集合框架(Java Collections Framework)為開發者提供了一系列通用容器&#xff0c;所謂容器就是可以容納其他對象的對象&#xff0c;在jdk1.2開始&#xff0c;就提供了通用容器。 1.Java集合框架的概述 容器是用于容納其他對象的對象&#xff0c;因此基本數據類型無法直接使…

聚數力 以數興 | 與“閩”同行,共話數字未來

閩江之畔&#xff0c;數智騰飛。5月24日&#xff0c;第七屆數字中國建設峰會在海峽國際會展中心盛大舉辦。本屆展會的主題是“釋放數據要素價值&#xff0c;發展新質生產力”&#xff0c;由國家發展改革委、國家數據局、福建省人民政府等單位共同主辦&#xff0c;福州市人民政府…

SVD求解Ax=0

源于計算機視覺life的LiDAR視覺IMU多傳感器融合SLAM&#xff1a;原理推導源碼逐行詳解項目實戰 SVD求解Ax0 首先&#xff0c;我們需要了解四元數的基本概念。四元數是由三個虛部和一個實部組成的復數擴展&#xff0c;可以用來表示三維空間中的旋轉。四元數的乘法規則如下&…

數據恢復的救星!快速恢復手機數據的2個秘籍!

當我們的照片、視頻、聯系人、短信和應用程序丟失時&#xff0c;許多人可能會感到束手無策&#xff0c;無論是珍貴的照片、重要的工作文件還是個人的聯系方式&#xff0c;一旦丟失&#xff0c;都可能帶來極大的不便和困擾。但隨著數據恢復技術的發展&#xff0c;我們有了更多的…

銳捷網絡與您相約第七屆數字中國建設峰會 共話數字未來

第七屆數字中國建設峰會將于5月24日至25日在福建福州舉辦,本屆峰會是國家數據工作體系優化調整后首次舉辦的數字中國建設峰會,主題是“釋放數據要素價值,發展新質生產力”。作為行業領先的ICT基礎設施及解決方案提供商,銳捷網絡與福建省電子信息集團、星網銳捷,圍繞“發展新質生…

2024中青杯數學建模競賽A題人工智能視域下養老輔助系統的構建思路代碼論文分析

2024中青杯數學建模A題論文和代碼已完成&#xff0c;代碼為A題全部問題的代碼&#xff0c;論文包括摘要、問題重述、問題分析、模型假設、符號說明、模型的建立和求解&#xff08;問題1模型的建立和求解、問題2模型的建立和求解、問題3模型的建立和求解&#xff09;、模型的評價…

java練習2

題目要求 創建一個Color枚舉類有RED,BLUE,BLACK,YELLOW,GREEN這五個枚舉值/對象Color有三個屬性redValue&#xff0c;greenValue&#xff0c;blueValue創建構造方法&#xff0c;參數包括這三個屬性每個枚舉值都要給這三個屬性賦值&#xff0c;三個屬性對應的值分別是red&#…

Windows批處理命令和概念

Windows中的BAT文件是一種批處理文件&#xff0c;它允許用戶執行一系列命令和腳本。這些命令可以是簡單的&#xff0c;如復制文件或刪除文件&#xff0c;也可以是更復雜的&#xff0c;如運行程序或調用其他批處理文件。以下是一些常用的Windows批處理指令&#xff1a; ECHO - 顯…

用go語言實現一個有界協程池

寫在文章開頭 本篇文章算是對go語言系列的一個收尾&#xff0c;通過go語言實現一個實現一個簡單的有界協程池。 Hi&#xff0c;我是 sharkChili &#xff0c;是個不斷在硬核技術上作死的 java coder &#xff0c;是 CSDN的博客專家 &#xff0c;也是開源項目 Java Guide 的維護…

HDR視頻相關標準-HDR vivid(二)

上文介紹了HDRvivid的一些技術。今天從全局角度來看看HDR視頻的處理流程&#xff0c;HDR視頻系統&#xff0c;即建立一個比SDR視頻更大的色彩/亮度坐標體系&#xff0c;并改變系統的傳輸函數&#xff0c;以再現更大的色域(WCG)和更高的亮度動態范圍。 菁彩 HDR技術的專業術語 …

【ROSUbuntu】常用工具合集

1. 源 ADM64 ubuntu | 鏡像站使用幫助 | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror arm64 ubuntu-ports | 鏡像站使用幫助 | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 2. FileZilla sudo apt-get install filezilla 3. Nomachine8 AMD64

操作系統實戰(四)(linux+C語言)

目錄 實驗目的 前提知識 實驗題目 題目分析 實驗程序 頭文件 頭文件實現 核心代碼文件 &#xff08;各類進程&#xff09; 生產者 抽煙者A 抽煙者B 抽煙者C makefile文件 實驗運行 運行結果分析 總結 實驗目的 加深對并發協作進程同步與互斥概念的理解&…