怎樣實現UDP可靠傳輸

2021-08-03 06:03:39 字數 3243 閱讀 6696

相對於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 新增傳送和接收緩衝...