相對於tcp,由於udp是面向無連線、不可靠的傳輸協議。
如果我們要用udp去實現可靠的傳輸,則需要解決兩個問題:丟包和後發先至(包的順序)。
解決方法:
1)給資料報編號,按照包的順序接收並儲存;
2)接收端接收到資料報後傳送確認資訊給傳送端,傳送端接收確認資料以後再繼續傳送下乙個包,如果接收端收到的資料報的編號不是期望的編號,則要求傳送端重新傳送。
1.server端**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define server_port 8000
#define buffer_size 1024
#define file_name_max_size 512
/* 包頭 */
typedef
struct
packinfo;
/* 接收包 */
struct sendpack
data;
int main()
/* 繫結套介面 */
if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
/* 資料傳輸 */
while(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)
else
/* 接收確認訊息 */
recvfrom(server_socket_fd, (char*)&pack_info, sizeof(pack_info), 0, (struct sockaddr*)&client_addr, &client_addr_length);
receive_id = pack_info.id;
} else
} else
/* 接收確認訊息 */
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; }
2.client端**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define server_port 8000
#define buffer_size 1024
#define file_name_max_size 512
/* 包頭 */
typedef
struct
packinfo;
/* 接收包 */
struct recvpack
data;
int main()
/* 輸入檔名到緩衝區 */
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)
/* 開啟檔案,準備寫入 */
file *fp = fopen(file_name, "w");
if(null == fp)
/* 從伺服器接收資料,並寫入檔案 */
int len = 0;
while(1)
/* 寫入檔案 */
if(fwrite(data.buf, sizeof(char), data.head.buf_size, fp) < data.head.buf_size)
} else
if(data.head.id < id) /* 如果是重發的包 */
} else
{} }
else
} printf("receive file:\t%s from server ip successful!\n", file_name);
fclose(fp);
close(client_socket_fd);
return
0; }
UDP實現可靠傳輸
如何讓udp實現可靠傳輸 自定義通訊協議,在應用層定義一些可靠的協議,比如檢測包的順序,重複包等問題,如果沒有收到對方的ack,重新發包 udp沒有delievery garuantee,也沒有順序保證,所以如果你要求你的資料傳送與接受既要高效,又要保證有序,收包確認等,你就需要在udp協議上構建自...
UDP協議及UDP實現可靠傳輸
udp基於傳輸層 16位 2位元組 16位 2位元組 16位 2位元組 16位 2位元組 udp源埠號 udp目的埠號 udp長度 udp檢驗和資料 udp的傳輸過程類似於寄信 什麼時面向資料報 應用層交給udp多長的報文,udp原樣傳送,既不會拆分,也不會合併 老實巴交的 用udp傳輸100個位元...
如何實現udp的可靠傳輸
傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現了。實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。最簡單的方式是在應用層模仿傳輸層tcp的可靠性傳輸。下面不考慮擁塞處理,可靠udp的簡單設計。1 新增seq ack機制,確保資料傳送到對端 2 新增傳送和接收緩衝...