TCPUDP Socket Clients and Servers DLPI socket raw

  • Slides: 31
Download presentation
TCP/UDP Socket介紹與實作

TCP/UDP Socket介紹與實作

Clients and Servers DLPI socket raw socket routing socket Client TCP/UDP socket Server TCP

Clients and Servers DLPI socket raw socket routing socket Client TCP/UDP socket Server TCP IP IP MAC PHY Internet PHY

TCP Socket server client

TCP Socket server client

Create a socket(3/4) type: • SOCK_STREAM:對應的protocol為TCP。 protocol: • 設定socket的協定標準,一般來說都會設為 0,讓kernel選擇type對 應的協議。

Create a socket(3/4) type: • SOCK_STREAM:對應的protocol為TCP。 protocol: • 設定socket的協定標準,一般來說都會設為 0,讓kernel選擇type對 應的協議。

Create a socket(4/4) Return Value • 成 功 產 生 socket時 , 會 返

Create a socket(4/4) Return Value • 成 功 產 生 socket時 , 會 返 回 該 socket的 檔 案 描 述 符 (socket file descriptor),我們可以透過它來操作socket。若socket創建失敗則 會回傳-1(INVALID_SOCKET)。

設定 IP 與 port • netinet/in. h為我們定義好了一個struct sockaddr_in來儲存IP和port:

設定 IP 與 port • netinet/in. h為我們定義好了一個struct sockaddr_in來儲存IP和port:

設置Server的監聽 • server 端的 Socket 經過bind後,進 入聆聽(Listen)狀態,準備 聆聽來自 Client 端的連線要求。 • int listen(int sockfd,

設置Server的監聽 • server 端的 Socket 經過bind後,進 入聆聽(Listen)狀態,準備 聆聽來自 Client 端的連線要求。 • int listen(int sockfd, int backlog): backlog 規定最多能有幾個client 能連入server。

Server 接收請求 • 使用 int accept(int sockfd, struct sockaddr, socklen_t addrlen)接 收來自 Client 端的連線請求,sockfd

Server 接收請求 • 使用 int accept(int sockfd, struct sockaddr, socklen_t addrlen)接 收來自 Client 端的連線請求,sockfd 的值和listen() 中所使用的 sockfd 值相同。 • Return value:它會傳回一個新的Socket描述符,以後和Client端交 談的是這個新創出的Socket,如果失敗則傳回-1。

傳送與接收資料(2/2) • ssize_t write(int fd, const void*buf, size_t count) • ssize_t read(int fd, void*buf,

傳送與接收資料(2/2) • ssize_t write(int fd, const void*buf, size_t count) • ssize_t read(int fd, void*buf, size_t count) • fd:連線的 Socket ID • buf:是一個字元指標,表示所接收/傳送資料的存放位址。 • count:接收或傳送資料的長度

UDP socket(2/2)

UDP socket(2/2)

設定 IP 與 port • netinet/in. h為我們定義好了一個struct sockaddr_in來儲存IP和port:

設定 IP 與 port • netinet/in. h為我們定義好了一個struct sockaddr_in來儲存IP和port:

sendto():傳送資料(1/2) sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr

sendto():傳送資料(1/2) sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, socklen_t tolen) sockfd: 表示本身 Socket ID(型態為 SOCK_DGRAM)。 msg :為欲傳送資料的指標位置 len:表示所要傳送資料的長度(byte)

 recvfrom():接收資料(1/2) recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from,

recvfrom():接收資料(1/2) recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen) sockfd: 表示本身 Socket ID(型態為 SOCK_DGRAM)。 buf :為所接收資料存放位址的指標 len:為預留多少長度的緩衝器準備接收資料

Server example

Server example

Client example

Client example

在ubuntu 16. 04上實作

在ubuntu 16. 04上實作