34
Socket 程程程程

Socket 程式設計

  • Upload
    khuong

  • View
    101

  • Download
    0

Embed Size (px)

DESCRIPTION

Socket 程式設計. Outline. Introduction Function Call Design. Introduction. TCP/IP 是一個協定,是一組支援網路溝通協定的集合 。 定義網路 傳送時 的封包 說明封包應 包含哪些資訊 TCP/IP 模組架構包含 4 個 階層 網路 存取 層 ( 提供主機與實體網路連接,並具有發送封 包的能力 ) 網際網路層 ( 提供與硬體無關 的 IP address ,並將封包封送至網路上 ) 傳輸層 ( 是與網路應用程式間的界 面,可分為 TCP 、 UDP) - PowerPoint PPT Presentation

Citation preview

Page 1: Socket  程式設計

Socket 程式設計

Page 2: Socket  程式設計

Outline

• Introduction• Function Call• Design

Page 3: Socket  程式設計

Introduction• TCP/IP是一個協定,是一組支援網路溝通協定的集合。

– 定義網路傳送時的封包– 說明封包應包含哪些資訊

• TCP/IP模組架構包含4個階層– 網路存取層 ( 提供主機與實體網路連接,並具有發送封包的能力 )

– 網際網路層 ( 提供與硬體無關的 IP address ,並將封包封送至網路上 )

– 傳輸層 ( 是與網路應用程式間的界面,可分為 TCP 、 UDP)

– 應用層 ( 為網路除錯、檔案傳輸、遠端控制和網際網路活動提供應用程式 )

Page 4: Socket  程式設計

Introduction (cont.)

• TCP– TCP 是一個連結協定,透過 TCP 可確保接收端收到完整、正確的資料

• UDP– UDP 則是一個非連結協定,比 TCP 快,但可靠度差

應用層Application Layer

傳輸層Transport Layer

網際網路層Internet Layer

網路存取層Network Access Layer

Page 5: Socket  程式設計

Introduction (cont.)

• “Socket” 是一種可做雙向資料傳輸的通道,可經由此與 local 或是 remote 的程式做溝通。• Socket– local socket :主要用來與本地端的程序溝通– internet-domain socket :用來與遠地端的程序溝通

Page 6: Socket  程式設計

Outline

• Introduction• Function Call• Design

Page 7: Socket  程式設計

Function Call

• IPv4 socket 定址結構struct sockaddr_in {    sa_family_t sin_family;            unsigned short int sin_port;     struct in_addr sin_addr;    };

結構成員 說明sin_family 用來說明 socket 所使用的定址模式,在此必須設為

AF_INET ,表示 internet domain 的 socket 。sin_port 用來表示 TCP/IP 的 port umber ,設定 sin_port 必需使用

htons 函數作位元排序的動作。sin_addr 是一個 in_addr 的結構變數,用來表示 ip 位址。

Page 8: Socket  程式設計

Function Call (cont.)

• IPv4 socket 定址結構– Ex:#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>

struct sockaddr_in adr_srvr;adr_srvr.sin_family = AF_INET;adr_srvr.sin_addr.s_addr = inet_addr("192.168.1.100");//adr_srvr.sin_addr.s_addr = inet_addr(INADDR_ANY);adr_srvr.sin_port = htons(8000);

Page 9: Socket  程式設計

Function Call (cont.)

• 不論是 TCP 或 UDP 作為傳輸協定,都要透過socket 作資料傳輸,首要工作是先建立 socket

• int socket(int domain, int type, protocol);

引數 說明domain 設定為 AF_INET 表示 internet 協定type 連結的型態。

設定為 SOCK_STRREAM 表示 TCP 傳輸層協定。設定為 SOCK_DGRAM 表示 UCP 傳輸層協定。

protocol 通訊協定,一般為 0 ,表示自動選擇。

Page 10: Socket  程式設計

Function Call (cont.)

• socket()– Ex:#include <sys/types.h>#include <sys/socket.h>Int sockfd;sockfd = Socket(AF_INET, SOCK_STREAM, 0);

傳回值:成功:傳回 socket ID 。失敗:傳回 -1 。

Page 11: Socket  程式設計

Function Call (cont.)port type 說明20 TCP FTP - data port Official

21 TCP FTP - control (command) port Official

22 TCP SSH (Secure Shell) - used for secure logins, file transfers (scp, sftp) and port forwarding Official

23 TCP Telnet protocol - unencrypted text communications Official

25 TCP SMTP - used for e-mail routing between mailservers E-mails Official

53 TCP DNS (Domain Name System) Official

80 TCP HTTP (HyperText Transfer Protocol) - used for transferring web pages Official

80 TCP HTTP - HTTP listening port Official

110 TCP POP3 (Post Office Protocol version 3) - used for sending/retrieving E-mails

137 TCP NetBIOS NetBIOS Name Service Official

138 TCP NetBIOS NetBIOS Datagram Service Official

139 TCP NetBIOS NetBIOS Session Service Official

Page 12: Socket  程式設計

Function Call (cont.)port type 說明20 UDP FTP - data port Official

21 UDP FTP - control (command) port Official

22 UDP SSH (Secure Shell) - used for secure logins, file transfers (scp, sftp) and port forwarding Official

23 UDP Telnet protocol - unencrypted text communications Official

25 UDP SMTP - used for e-mail routing between mailservers E-mails Official

53 UDP DNS (Domain Name System) Official

67 UDP BOOTP (BootStrap Protocol) server; also used by DHCP (Dynamic Host Configuration Protocol) Official

137 UDP NetBIOS NetBIOS Name Service Official

138 UDP NetBIOS NetBIOS Datagram Service Official

139 UDP NetBIOS NetBIOS Session Service Official

Page 13: Socket  程式設計

Function Call (cont.)

• 將 IPv4 socket 定址結構連結到所建立的socket

• int bind(int sockfd, const struct sockaddr *my_addr, size_t adr_len);

引數 說明sockfd socket 函數執行後傳回的 socket ID

my_addr 指向 socket sockaddr_in 結構的指標,用來存放連結的IPv4 定址結構

adr_len struct sockaddr_in 結構的長度,可將其指定為sizeof(struct sockaddr_in)

Page 14: Socket  程式設計

Function Call (cont.)

• bind()– Ex:#include <sys/socket.h>

bind(sockfd, (struct sockaddr*)&adr_srvr, sizeof(struct sockaddr));

傳回值:成功:傳回 0 。失敗:傳回 -1 。

Page 15: Socket  程式設計

Function Call (cont.)

• 等待 client 端的連線要求,會把連線請求放在連線佇列中• int listen(int sockfd, int backlog);

引數 說明sockfd socket 函數執行後傳回的 socket ID

backlog 指定最大連線的數量,通常為 5

Page 16: Socket  程式設計

Function Call (cont.)

• listen()– Ex:#include <sys/socket.h>Int num = 5;listen(sockfd, num);

傳回值:成功:傳回 0 。失敗:傳回 -1 。

Page 17: Socket  程式設計

Function Call (cont.)

• 呼叫 accept 函數來處理並接受佇列中的連線請求• int accept(int socketfd, struct sockaddr *addr, socklen_t addrlen);

引數 說明sockfd socket 函數執行後傳回的 socket IDaddr 指向 struct sockaddr_in 結構的指標,用來存放 client 端的

IP addressaddrlen 存放 client IP address 變數的長度,初值為 sizeof(struct

sockaddr_in) , accept() 執行成功後會回存實際的 client ip address 長度。

Page 18: Socket  程式設計

Function Call (cont.)

• accept()– Ex:#include <sys/socket.h>accept(sockfd, (struct sockaddr*)&adr_srvr, (struct sockaddr*)&sizeof(adr_srvr));

傳回值:成功:傳回 client 的 socket ID ,稱為 connect socket 。失敗:傳回 -1 。

Page 19: Socket  程式設計

Function Call (cont.)

• 用 connect() 函數向 server 端要求建立連線

• int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

引數 說明sockfd socket 函數執行後傳回的 socket IDserv_addr 指向 struct sockaddr_in 結構的指標,用來存放 server 的

address1addrlen struct sockaddr_in 結構的長度,可指定為 sizeof(struct

sockaddr_in)

Page 20: Socket  程式設計

Function Call (cont.)

• connect()– Ex:#include <sys/socket.h>connect(sockfd, (struct sockaddr*)&adr_srvr, (struct sockaddr*)&sizeof(adr_srvr));

傳回值:成功:傳回 0 。失敗:傳回 -1 。

Page 21: Socket  程式設計

Function Call (cont.)

• 將資料寫入已經開啟的 socket

• int write(int sockfd, char *buf, int len);

引數 說明sockfd socket 函數執行後傳回的 socket ID

buf 指向字元暫存器的指標,用來存放讀取到的資料len 欲讀取的字元長度。

Page 22: Socket  程式設計

Function Call (cont.)

• write()– Ex:#include <sys/socket.h>Char buf[MAX_PATH] = “HelloWorld”;write(sockfd, buf, sizeof(buf));

傳回值:成功:傳回寫入的字元數。失敗:傳回 -1 。

Page 23: Socket  程式設計

Function Call (cont.)

• 從已經開啟的 socket 讀取資料

• int read(int sockfd, char *buf, int len);

引數 說明sockfd socket 函數執行後傳回的 socket ID

buf 指向字元暫存器的指標,用來存放讀取到的資料len 欲讀取的字元長度。

Page 24: Socket  程式設計

Function Call (cont.)

• read()– Ex:#include <sys/socket.h>Char buf[MAX_PATH];read(sockfd, buf, sizeof(buf));

傳回值:成功:傳回接收的字元數。失敗:傳回 -1 。

Page 25: Socket  程式設計

Function Call (cont.)

• 從已經開啟的 socket 傳送資料

• int send(int sockfd, const void *msg, int len, unsigned int flags);

flags 引數 說明MSG_OOB 接收的資料以 out-of-band 送出MSG_DONTROUTE 取消 route 的查詢MSG_DONTWAIT 傳送過程不可以被阻斷MSG_NOSIGNAL 傳送動作不會因 SIGPIPE 訊號中斷

Page 26: Socket  程式設計

Function Call (cont.)

• send()– Ex:#include <sys/types.h>#include <sys/socket.h>Char buf[MAX_PATH] = “HelloWorld”;send(sockfd, buf, sizeof(buf), 0);

傳回值:成功:傳回傳送的字元數。失敗:傳回 -1 。

Page 27: Socket  程式設計

Function Call (cont.)

• 從已經開啟的 socket 接收資料

• int recv(int sockfd, const void *msg, int len, unsigned int flags);

flags 引數 說明MSG_OOB 接收以 out-of-band 送來的資料MSG_PEEK 遠端 socket 傳來的資料,不會在接收受刪除MSG_WAITALL 固定接收 len 引數指定長度的資料,除非有錯誤或訊號發

生MSG_NOSIGNAL 接收動作不會因 SIGPIPE 訊號中斷

Page 28: Socket  程式設計

Function Call (cont.)

• recv()– Ex:#include <sys/types.h>#include <sys/socket.h>Char buf[MAX_PATH];recv(sockfd, buf, sizeof(buf), 0);

傳回值:成功:傳回接收的字元數。失敗:傳回 -1 。

Page 29: Socket  程式設計

Function Call (cont.)

• 呼叫 close() 終止 client 端和 server 端的連線。

• int close(int sockfd);

引數 說明sockfd socket 函數執行後傳回的 socket ID

Page 30: Socket  程式設計

Function Call (cont.)

• close()– Ex:#include <unistd.h>int close(int sockfd);

傳回值:成功:傳回 0 。失敗:傳回 -1 。

Page 31: Socket  程式設計

Outline

• Introduction• Function Call• Design

Page 32: Socket  程式設計

Design• 設計 tcp 網路程式– TCP client 端

• 1. 建立 socket( 使用 socket() 函數 )• 2. 向 server 要求連線 ( 使用 connect() 函數 )• 3. 若連線成功,使用輸出入函數和 server 端互傳訊息• 4. 關閉 socket ,結束連線 ( 使用 close() 函數 )

– TCP server 端• 1. 建立 socket( 使用 socket() 函數 )• 2. 連結 socket( 使用 bind() 函數 )• 3. 開啟 listening socket( 使用 listen() 函數 )• 4. 等待 client 連線要求 ( 使用 accept() 函數 )• 5. 若連線成功,使用輸出入函數和 client 端互傳訊息• 6. 關閉 socket ,結束連線 ( 使用 close() 函數 )

Page 33: Socket  程式設計

Design (cont.)

• TCP 程式設計流程socket

bind

listen

accept

wait

read

write

close

connect

write

read

close

socketServer

Client

建立連線

請求資料

回應請求

Page 34: Socket  程式設計

Thanks