網絡編程(TFTP協議實驗)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>#define PORT 69       //端口號:填服務器綁定端口號
#define IP   "192.168.1.101"   //IP地址:windows的IP地址int upload(int cfd,struct sockaddr_in sin)
{char filename[20] = "";printf("請輸入要上傳的文件名>>> ");scanf("%s", filename);while(getchar()!=10);//判斷文件存不存在int fd = open(filename,O_RDONLY);if(fd < 0){ERR_MSG("open");return -1;}//發送數據char buf[516] = "";int size = sprintf(buf, "%c%c%s%c%s%c", 0, 2, filename, 0, "octet", 0);if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin)) < 0) {ERR_MSG("sendto");return -1;}printf("sendto success\n");socklen_t addrlen = sizeof(sin);ssize_t res = 0;unsigned short num = 0;      //本地記錄的塊編號while(1){bzero(buf, sizeof(buf));//接收服務器的應答res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen);if(res < 0){ERR_MSG("recvfrom");break;}if(4 == buf[1]){if(htons(num) == *(unsigned short*)(buf+2)){//組數據包給服務器num++;*(unsigned short*)buf = htons(3);*(unsigned short*)(buf+2) = htons(num);res = read(fd, buf+4, 512);if(res < 0){break;}else if(0 == res){printf("文件:%s 上傳完畢\n", filename);break;}//發送數據包if(sendto(cfd, buf, res+4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}}}else if(5 == buf[1])//錯誤包{printf("MSG_ERR: code[%d] msg[%s] __%d__\n", \ntohs(*(unsigned short*)(buf+2)), buf+4, __LINE__);break;}}close(fd);return 0;
}int download(int cfd,struct sockaddr_in sin)
{char buf[516] = "";char filename[20] = "";printf("請輸入要下載的文件名>>> ");scanf("%s", filename);while(getchar()!=10);//發送下載請求//組協議包int size = sprintf(buf, "%c%c%s%c%s%c", 0, 1, filename, 0, "octet", 0);//sendto if(sendto(cfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}//本地創建并打開要下載的文件int fd = -1;     //必須初始化一個無意義的文件描述符,否則下面的closesocklen_t addrlen = sizeof(sin);ssize_t res = 0;unsigned short num = 0;      //本地記錄的塊編號//循環接收數據包,回復ACkwhile(1){bzero(buf, sizeof(buf));//接收數據包res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen);if(res < 0){ERR_MSG("recvfrom");break;}if(3 == buf[1])     //數據包{if(htons(num+1) == *(unsigned short*)(buf+2)){num++;if(-1 == fd){fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664);if(fd < 0){ERR_MSG("open");break;}}//將獲取到的數據,寫入到文件中if(write(fd, buf+4, res-4) < 0){ERR_MSG("write");break;}buf[1] = 4;if(sendto(cfd, buf, 4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");break;}if(res-4 < 512){printf("======= 文件下載完畢 =======\n");break;}}}else if(5 == buf[1])//錯誤包{printf("MSG_ERR: code[%d] msg[%s] __%d__\n", \ntohs(*(unsigned short*)(buf+2)), buf+4, __LINE__);break;}}close(fd);return 0;
}
int main(int argc, const char *argv[])
{//創建報式套接字int cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n",cfd);//綁定客戶端的地址信息結構體到套接字上--->非必須綁定//若不綁定,則操作系統會給客戶端綁定上客戶端所在的主機IP以及隨機端口(49151~65535)//填充地址信息結構體,真實的地址信息結構體根據地址族制定//AF_INET:man 7 ip//要連接哪個服務器,就填對應服務器的IP和端口struct sockaddr_in sin;sin.sin_family      = AF_INET;       //必須填AF_INETsin.sin_port        = htons(PORT);   //端口號:填服務器綁定端口號sin.sin_addr.s_addr = inet_addr(IP);  //IP地址:服務器綁定的IP地址char c = 0;while(1){	printf("-------------------------\n");printf("---------1.下載----------\n");printf("---------2.上傳----------\n");printf("-------------------------\n");printf("請輸入>>> ");c = getchar();while(getchar()!=10);switch(c){case '1' :download(cfd,sin);break;case '2' :upload(cfd,sin);break;default :printf("輸入錯誤,請重新輸入\n");break;}while(getchar()!=10);}//關閉所有文件描述符close(cfd);return 0;
}

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

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

相關文章

網絡安全威脅與防御策略

第一章&#xff1a;引言 隨著數字化時代的快速發展&#xff0c;網絡已經成為人們生活和工作中不可或缺的一部分。然而&#xff0c;網絡的廣泛應用也引發了一系列嚴峻的網絡安全威脅。惡意軟件、網絡攻擊、數據泄露等問題層出不窮&#xff0c;給個人和企業帶來了巨大的風險。本文…

mysql基礎之觸發器的簡單使用

1.建立學生信息表 -- 觸發器 -- 建立學生信息表 create table s1(id int unsigned auto_increment,name varchar(30),score tinyint unsigned,dept varchar(50),primary key(id) );2.建立學生補考信息表 -- 建立學生補考信息表 create table s2 like s1;3.建立觸發器&#xf…

java 自定義xss校驗注解實現

自定義一個注解Xss。名字隨意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

深入理解與運用Android Jetpack ViewModel

在Android開發中&#xff0c;數據與界面的分離一直是一項重要的挑戰。為了解決這個問題&#xff0c;Google推出了Android Jetpack組件之一的ViewModel。ViewModel是一種用于管理UI相關數據的架構組件&#xff0c;它能夠幫助開發者實現優雅的數據驅動和生命周期管理。本文將深入…

C字符串練習題(6.3.1)

編寫一個程序&#xff0c;從鍵盤上讀入一個小于1000的正整數&#xff0c;然后創建并輸出一個字符串&#xff0c;說明該整數的值。例如&#xff0c;輸入941&#xff0c;程序產生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

前端HTML入門基礎

階段目標&#xff1a;掌握HTML、CSS常用布局技巧&#xff0c;能夠獨立制作網頁。 day01&#xff1a;HTML 基礎 目標&#xff1a;掌握標簽基本語法&#xff0c;能夠獨立布局文章頁。 01-今日課程介紹 今日目標&#xff1a;掌握標簽基本語法&#xff0c;能夠獨立布局文章頁。 核心…

SQL中CONVERT函數格式:CONVERT(data_type,expression[,style])

sqlserver convert()函數的使用方法_convert sqlserver_qq_37528515的博客-CSDN博客 SQL中CONVERT函數格式:CONVERT(data_type,expression[,style]) 說明&#xff1a; data_type:目標系統所提供的數據類型&#xff0c;如果轉換時沒有指定數據類型的長度&#xff0c;則 SQL Serv…

Maven基礎總結

前言 Maven 是一個項目管理工具&#xff0c;可以對 Java 項目進行構建、依賴管理。 基本要求掌握 配置Maven環境直接查。 得會在IDEA創建Maven的java項目吧、會創建Maven的web項目吧、會創建多模塊項目吧。 得會配置插件pligin、依賴dependency吧 一、Maven四大特性 1、…

CSS:服務器字體 與 響應式布局(用法 + 例子 + 效果)

文章目錄 服務器字體定義 服務器字體使用例子 響應式布局設備類型設備特性例子 服務器字體 解決字體不一致而產生的。 首先&#xff0c;在網上把字體下載好。 定義 服務器字體 font-face{font-family:字體名稱;src:url(字體資源路徑); }使用 在需要使用的選擇器里加上 font…

數學建模(一)前繼概念

課程推薦&#xff1a;數學建模老哥_嗶哩嗶哩_bilibili 目錄 一、什么是數學建模&#xff1f; 二、數學建模的一般步驟 三、數學建模賽題類型 1.預測型 2. 評價類 3.機理分析類 4. 優化類 一、什么是數學建模&#xff1f; 數學建模是利用數學方法解決實際問題的一種實踐。…

什么是多線程?進程和線程的區別是什么?如何使用Java實現多線程?

文章目錄 前言我們為什么要使用線程而不是進程來實現并發編程什么是線程進程和線程的區別如何使用Java實現多線程創建線程1.創建一個繼承 Thread 類的線程類2.實現 Runnable 接口匿名內部類方式實現 Runnable 接口lambda 表達式實現 Runnable 接口 Thread 類的常見構造方法Thre…

T113-S3-RTL8211網口phy芯片調試

目錄 前言 一、RTL8211介紹 二、硬件連接 三、設備樹配置 四、內核配置 五、phy芯片配置 六、調試問題 總結 前言 在嵌入式系統開發中&#xff0c;網絡連接是至關重要的一部分。T113-S3開發板搭載了RTL8211系列的網口PHY芯片&#xff0c;用于實現以太網連接。在開發過程…

C++ QT(二)

目錄 Qt 控件按鈕QPushButton控件簡介用法示例運行效果 QToolButton控件簡介用法示例運行效果 QRadioButton控件簡介用法示例運行效果 QCheckBox控件簡介用法示例運行效果 QCommandLinkButton控件簡介用法示例運行效果 QDialogButtonBox控件簡介用法示例運行效果 輸入窗口部件Q…

用 React+ts 實現無縫滾動的走馬燈

一、走馬燈的作用 走馬燈是一種常見的網頁交互組件&#xff0c;可以展示多張圖片或者內容&#xff0c;通過自動播放或者手動切換的方式&#xff0c;讓用戶能夠方便地瀏覽多張圖片或者內容。 本次實現的不是輪播圖而是像傳送帶一樣的無限滾動的形式。 二、需求梳理 走馬燈可設…

Go Gin 中使用 JWT

一、JWT JWT全稱JSON Web Token是一種跨域認證解決方案&#xff0c;屬于一個開放的標準&#xff0c;它規定了一種Token實現方式&#xff0c;目前多用于前后端分離項目和OAuth2.0業務場景下。 二、為什么要用在你的Gin中使用JWT 傳統的Cookie-Sesson模式占用服務器內存, 拓展性…

uniapp實現自定義導航內容高度居中(兼容APP端以及小程序端與膠囊對齊)

①效果圖如下 1.小程序端與膠囊對齊 2.APP端內容區域居中 注意&#xff1a;上面使用的是colorui里面的自定義導航樣式。 ②思路&#xff1a; 1.APP端和小程序端走不同的方法&#xff0c;因為小程序端要計算不同屏幕下右側膠囊的高度。 2.其次最重要的要清晰App端和小程序端…

【數學建模】清風數模更新5 灰色關聯分析

灰色關聯分析綜述 諸如經濟系統、生態系統、社會系統等抽象系統都包含許多因素&#xff0c;系統整體的發展受各個因素共同影響。 為了更好地推動系統發展&#xff0c;我們需要清楚哪些因素是主要的&#xff0c;哪些是次要的&#xff0c;哪些是積極的&#xff0c;哪些是消極的…

網絡基礎——網絡的由來與發展史

作者&#xff1a;Insist-- 個人主頁&#xff1a;insist--個人主頁 作者會持續更新網絡知識和python基礎知識&#xff0c;期待你的關注 目錄 一、網絡的由來 二、計算機網絡的發展史 1、第一階段 2、第二階段 3、第三階段 前言 每天都是使用網絡&#xff0c;那么你知道網絡…

FPGA----Vivado SDK創建并使用靜態鏈接庫(C/C++代碼移植)

1、在進行SoC開發時&#xff0c;PS端的C/C代碼可能涉及到核心算法需要移植操作&#xff0c;為此&#xff0c;本文講述了如何將C/C代碼打包為.a文件供程序調用 2、文章以我的程序為例&#xff0c;逐步講述代碼生成靜態鏈接庫并調用的方法。 下面是我程序的目錄結構&#xff0c…

spring boot實現實體類參數自定義校驗

安裝依賴項 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>1、新建實體類 Data public class UserEntity {private String name;private Integer age;…