天天看點

UDP Server/Client

UDP是無連接配接,不可靠的傳輸。但是怎麼又會有Server/Client的說法呢?請看紅色字型的解釋。

UDP Server程式

編寫程式

(1)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。

(2)初始化sockaddr_in結構的變量,并指派。sockaddr_in結構定義:

struct sockaddr_in {

uint8_t sin_len ;

sa_family_t sin_family;

in_port_t sin_port ;

struct in_addrsin_addr;

char sin_zero[8];

};

這裡使用“8888”作為服務程式的端口,使用“ INADDR_ANY”作為綁定的IP位址即任何主機上的位址。

(3)使用 bind()把上面的 socket和定義的IP位址和端口綁定。這裡檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程式重複運作的問題。

(4)進入無限循環程式,使用recvfrom()進入等待狀态,直到接收到客戶程式發送的資料,就處理收到的資料,并向客戶程式發送回報。這裡是直接把收到的資料發回給客戶程式。

UDP Client程式

1、編寫UDP Client程式的步驟

(1)初始化sockaddr_in結構的變量,并指派。這裡使用“8888”作為連接配接的服務程式的端口,從指令行參數讀取IP位址,并且判斷IP位址是否符合要求。

(2)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。

(3)使用connect()來建立與服務程式的連接配接。與TCP協定不同,UDP的connect()并沒有與服務程式三次握手。上面說了UDP是非連接配接的,實際上也可以是連接配接的。使用連接配接的UDP,kernel可以直接傳回錯誤資訊給使用者程式,進而避免由于沒有接收到資料而導緻調用recvfrom()一直等待下去,看上去好像客戶程式沒有反應一樣。

(4)向服務程式發送資料,因為使用連接配接的UDP,是以使用write()來替代sendto()。這裡的資料直接從标準輸入讀取使用者輸入。

(5)接收服務程式發回的資料,同樣使用read()來替代recvfrom()。

(6)處理接收到的資料,這裡是直接輸出到标準輸出上。

繼續閱讀