亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Linux網絡編程之基于UDP實現可靠的文件傳輸示例

2020-01-26 15:24:13
字體:
來源:轉載
供稿:網友

了解網絡傳輸協議的人都知道,采用TCP實現文件傳輸很簡單。相對于TCP,由于UDP是面向無連接、不可靠的傳輸協議,所以我們需要考慮丟包和后發先至(包的順序)的問題,所以我們想要實現UDP傳輸文件,則需要解決這兩個問題。方法就是給數據包編號,按照包的順序接收并存儲,接收端接收到數據包后發送確認信息給發送端,發送端接收確認數據以后再繼續發送下一個包,如果接收端收到的數據包的編號不是期望的編號,則要求發送端重新發送。

下面展示的是基于linux下C語言實現的一個示例程序,該程序定義一個包的結構體,其中包含數據和包頭,包頭里包含有包的編號和數據大小,經過測試后,該程序可以成功傳輸一個視頻文件。

具體實現代碼如下:

server端代碼如下:

/*************************************************************************   > File Name: server.c   > Author: SongLee  ************************************************************************/ #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<netdb.h> #include<stdarg.h> #include<string.h>  #define SERVER_PORT 8000 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512  /* 包頭 */ typedef struct {   int id;   int buf_size; }PackInfo;  /* 接收包 */ struct SendPack {   PackInfo head;   char buf[BUFFER_SIZE]; } data;   int main() {   /* 發送id */   int send_id = 0;    /* 接收id */   int receive_id = 0;    /* 創建UDP套接口 */   struct sockaddr_in server_addr;   bzero(&server_addr, sizeof(server_addr));   server_addr.sin_family = AF_INET;   server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   server_addr.sin_port = htons(SERVER_PORT);    /* 創建socket */   int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);   if(server_socket_fd == -1)   {     perror("Create Socket Failed:");     exit(1);   }    /* 綁定套接口 */   if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))   {     perror("Server Bind Failed:");     exit(1);   }    /* 數據傳輸 */   while(1)   {       /* 定義一個地址,用于捕獲客戶端地址 */     struct sockaddr_in client_addr;     socklen_t client_addr_length = sizeof(client_addr);      /* 接收數據 */     char buffer[BUFFER_SIZE];     bzero(buffer, BUFFER_SIZE);     if(recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length) == -1)     {       perror("Receive Data Failed:");       exit(1);     }      /* 從buffer中拷貝出file_name */     char file_name[FILE_NAME_MAX_SIZE+1];     bzero(file_name,FILE_NAME_MAX_SIZE+1);     strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));     printf("%s/n", file_name);      /* 打開文件 */     FILE *fp = fopen(file_name, "r");     if(NULL == fp)     {       printf("File:%s Not Found./n", file_name);     }     else     {       int len = 0;       /* 每讀取一段數據,便將其發給客戶端 */       while(1)       {         PackInfo pack_info;          if(receive_id == send_id)         {           ++send_id;           if((len = fread(data.buf, sizeof(char), BUFFER_SIZE, fp)) > 0)           {             data.head.id = send_id; /* 發送id放進包頭,用于標記順序 */             data.head.buf_size = len; /* 記錄數據長度 */             if(sendto(server_socket_fd, (char*)&data, sizeof(data), 0, (struct sockaddr*)&client_addr, client_addr_length) < 0)             {               perror("Send File Failed:");               break;             }             /* 接收確認消息 */             recvfrom(server_socket_fd, (char*)&pack_info, sizeof(pack_info), 0, (struct sockaddr*)&client_addr, &client_addr_length);             receive_id = pack_info.id;            }           else           {             break;           }         }         else         {           /* 如果接收的id和發送的id不相同,重新發送 */           if(sendto(server_socket_fd, (char*)&data, sizeof(data), 0, (struct sockaddr*)&client_addr, client_addr_length) < 0)           {             perror("Send File Failed:");             break;           }           /* 接收確認消息 */           recvfrom(server_socket_fd, (char*)&pack_info, sizeof(pack_info), 0, (struct sockaddr*)&client_addr, &client_addr_length);           receive_id = pack_info.id;          }       }       /* 關閉文件 */       fclose(fp);       printf("File:%s Transfer Successful!/n", file_name);     }   }   close(server_socket_fd);   return 0; } 

client端代碼如下:

/*************************************************************************   > File Name: client.c   > Author: SongLee  ************************************************************************/ #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<netdb.h> #include<stdarg.h> #include<string.h>  #define SERVER_PORT 8000 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512  /* 包頭 */ typedef struct  {   int id;   int buf_size; }PackInfo;  /* 接收包 */ struct RecvPack {   PackInfo head;   char buf[BUFFER_SIZE]; } data;   int main() {   int id = 1;    /* 服務端地址 */   struct sockaddr_in server_addr;   bzero(&server_addr, sizeof(server_addr));   server_addr.sin_family = AF_INET;   server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");   server_addr.sin_port = htons(SERVER_PORT);   socklen_t server_addr_length = sizeof(server_addr);    /* 創建socket */   int client_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);   if(client_socket_fd < 0)   {     perror("Create Socket Failed:");     exit(1);   }    /* 輸入文件名到緩沖區 */   char file_name[FILE_NAME_MAX_SIZE+1];   bzero(file_name, FILE_NAME_MAX_SIZE+1);   printf("Please Input File Name On Server: ");   scanf("%s", file_name);    char buffer[BUFFER_SIZE];   bzero(buffer, BUFFER_SIZE);   strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));    /* 發送文件名 */   if(sendto(client_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&server_addr,server_addr_length) < 0)   {     perror("Send File Name Failed:");     exit(1);   }    /* 打開文件,準備寫入 */   FILE *fp = fopen(file_name, "w");   if(NULL == fp)   {     printf("File:/t%s Can Not Open To Write/n", file_name);      exit(1);   }    /* 從服務器接收數據,并寫入文件 */   int len = 0;   while(1)   {     PackInfo pack_info;      if((len = recvfrom(client_socket_fd, (char*)&data, sizeof(data), 0, (struct sockaddr*)&server_addr,&server_addr_length)) > 0)     {       if(data.head.id == id)       {         pack_info.id = data.head.id;         pack_info.buf_size = data.head.buf_size;         ++id;         /* 發送數據包確認信息 */         if(sendto(client_socket_fd, (char*)&pack_info, sizeof(pack_info), 0, (struct sockaddr*)&server_addr, server_addr_length) < 0)         {           printf("Send confirm information failed!");         }         /* 寫入文件 */         if(fwrite(data.buf, sizeof(char), data.head.buf_size, fp) < data.head.buf_size)         {           printf("File:/t%s Write Failed/n", file_name);           break;         }       }       else if(data.head.id < id) /* 如果是重發的包 */       {         pack_info.id = data.head.id;         pack_info.buf_size = data.head.buf_size;         /* 重發數據包確認信息 */         if(sendto(client_socket_fd, (char*)&pack_info, sizeof(pack_info), 0, (struct sockaddr*)&server_addr, server_addr_length) < 0)         {           printf("Send confirm information failed!");         }       }       else       {        }     }     else     {       break;     }   }    printf("Receive File:/t%s From Server IP Successful!/n", file_name);   fclose(fp);   close(client_socket_fd);   return 0; }

感興趣的朋友可以動手測試一下該程序,相信會對大家的Linux下C語言網絡編程帶來一定的幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线视频网| 久久中文字幕在线| 18性欧美xxxⅹ性满足| 91免费看国产| 97精品一区二区视频在线观看| 视频在线一区二区| 欧美视频在线免费看| 在线视频欧美性高潮| 国产不卡av在线| 亚洲大胆人体av| 国产成人精品久久亚洲高清不卡| 91av在线看| 日韩在线视频国产| 国产噜噜噜噜久久久久久久久| 亚洲精品mp4| 亚洲最大av网站| 亚洲字幕一区二区| 91亚洲精品一区| 成人网在线免费观看| 成人在线视频网站| 国产精品美女久久久久久免费| 亚洲最大福利网| 欧美性xxxx极品hd欧美风情| 亚洲人成77777在线观看网| 91豆花精品一区| 国产免费一区视频观看免费| 久久99国产精品自在自在app| 欧美日韩中文字幕日韩欧美| 国产欧美日韩免费| 中文日韩在线观看| 欧美精品一区在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美在线视频观看| 日韩高清电影免费观看完整版| 久久久久久久久久国产| 色综合伊人色综合网站| 亚洲精品一区二区网址| 中文字幕欧美日韩精品| 亚洲成人xxx| 国模精品视频一区二区| 精品调教chinesegay| 成人美女av在线直播| 中国人与牲禽动交精品| 亚洲综合中文字幕68页| 中文字幕欧美日韩va免费视频| 国产精品久久久久一区二区| 国产一区二区色| 国产日韩欧美另类| 国产免费一区二区三区在线能观看| 日韩欧美在线视频日韩欧美在线视频| 日韩综合视频在线观看| 欧美一区在线直播| 久久影院在线观看| 国模叶桐国产精品一区| 91精品国产自产在线老师啪| 亚洲欧美日韩在线高清直播| 国产91色在线|| 国产成人高清激情视频在线观看| 亚洲社区在线观看| 亚洲成人av片| 欧美精品性视频| 国产91色在线|| 国产精品日韩一区| 日韩精品在线私人| 国产不卡在线观看| 国产91ⅴ在线精品免费观看| 精品无人国产偷自产在线| 国内精品视频在线| 欧美人在线视频| 性欧美xxxx视频在线观看| 91精品久久久久久久久久久久久久| 欧美极品美女视频网站在线观看免费| 亚洲美女www午夜| 久久综合电影一区| 国产精品电影观看| 欧美一级成年大片在线观看| 欧美天天综合色影久久精品| 黄色成人av网| 亚洲第一网站男人都懂| 日韩免费观看网站| 国产欧美精品日韩精品| 中文字幕av一区中文字幕天堂| 国产精品色婷婷视频| 亚洲free性xxxx护士白浆| 在线观看视频99| 少妇高潮久久77777| 国内精品400部情侣激情| 国产97色在线|日韩| 性色av一区二区三区免费| 97视频在线观看视频免费视频| 成人深夜直播免费观看| 亚洲欧洲免费视频| 91精品在线看| 国产一区二区日韩精品欧美精品| 亚洲二区在线播放视频| 韩日精品中文字幕| 日本久久久a级免费| 91久久在线视频| 国产精品pans私拍| 欧美激情亚洲精品| 91国产视频在线播放| 91精品国产亚洲| 日韩美女视频在线观看| 色中色综合影院手机版在线观看| 久久久噜久噜久久综合| 91系列在线观看| 视频在线观看一区二区| 欧美日韩国产麻豆| 欧美精品在线免费观看| 精品久久久久久久久久国产| 91久久久久久久一区二区| 成人激情视频在线观看| 国产一区二区动漫| 亚洲精品在线91| 中文字幕日韩电影| 一区国产精品视频| 孩xxxx性bbbb欧美| 亚洲国产精品va在线| 日韩av网址在线观看| 国产精品久久网| 精品福利一区二区| 国产成人福利夜色影视| 精品偷拍一区二区三区在线看| 中文在线资源观看视频网站免费不卡| 欧美激情二区三区| 欧美日韩国产va另类| 亚洲免费人成在线视频观看| 亚洲国产精品va在看黑人| 欧美在线免费观看| 日韩欧美中文第一页| 中文字幕亚洲自拍| 日本国产一区二区三区| 欧美一区二区影院| 欧美老女人性生活| 国产97在线亚洲| 欧美成人在线免费视频| 亲爱的老师9免费观看全集电视剧| 亚洲国产高潮在线观看| 欧美性猛交xxxx免费看漫画| 高清亚洲成在人网站天堂| 91av免费观看91av精品在线| 亚洲精品少妇网址| 亚洲国产精品网站| 日本精品久久中文字幕佐佐木| 欧美黑人狂野猛交老妇| 中文字幕在线观看日韩| 欧洲日本亚洲国产区| 96sao精品视频在线观看| 精品久久久久久电影| 精品国产999| 91免费视频网站| 91精品国产自产91精品| 久久久www成人免费精品张筱雨| 日韩av在线免费| 美女福利视频一区| 欧美成人免费在线视频| 亚洲va欧美va在线观看| 视频一区视频二区国产精品| 国产综合久久久久久| 欧美激情二区三区| 欧美激情一二区| 亚洲精品福利在线观看| 98视频在线噜噜噜国产| 一区二区三区www|