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
Socket 程式設計
Outline
• Introduction• Function Call• Design
Introduction• TCP/IP是一個協定,是一組支援網路溝通協定的集合。
– 定義網路傳送時的封包– 說明封包應包含哪些資訊
• TCP/IP模組架構包含4個階層– 網路存取層 ( 提供主機與實體網路連接,並具有發送封包的能力 )
– 網際網路層 ( 提供與硬體無關的 IP address ,並將封包封送至網路上 )
– 傳輸層 ( 是與網路應用程式間的界面,可分為 TCP 、 UDP)
– 應用層 ( 為網路除錯、檔案傳輸、遠端控制和網際網路活動提供應用程式 )
Introduction (cont.)
• TCP– TCP 是一個連結協定,透過 TCP 可確保接收端收到完整、正確的資料
• UDP– UDP 則是一個非連結協定,比 TCP 快,但可靠度差
應用層Application Layer
傳輸層Transport Layer
網際網路層Internet Layer
網路存取層Network Access Layer
Introduction (cont.)
• “Socket” 是一種可做雙向資料傳輸的通道,可經由此與 local 或是 remote 的程式做溝通。• Socket– local socket :主要用來與本地端的程序溝通– internet-domain socket :用來與遠地端的程序溝通
Outline
• Introduction• Function Call• Design
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 位址。
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);
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 ,表示自動選擇。
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 。
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
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
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)
Function Call (cont.)
• bind()– Ex:#include <sys/socket.h>
bind(sockfd, (struct sockaddr*)&adr_srvr, sizeof(struct sockaddr));
傳回值:成功:傳回 0 。失敗:傳回 -1 。
Function Call (cont.)
• 等待 client 端的連線要求,會把連線請求放在連線佇列中• int listen(int sockfd, int backlog);
引數 說明sockfd socket 函數執行後傳回的 socket ID
backlog 指定最大連線的數量,通常為 5
Function Call (cont.)
• listen()– Ex:#include <sys/socket.h>Int num = 5;listen(sockfd, num);
傳回值:成功:傳回 0 。失敗:傳回 -1 。
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 長度。
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 。
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)
Function Call (cont.)
• connect()– Ex:#include <sys/socket.h>connect(sockfd, (struct sockaddr*)&adr_srvr, (struct sockaddr*)&sizeof(adr_srvr));
傳回值:成功:傳回 0 。失敗:傳回 -1 。
Function Call (cont.)
• 將資料寫入已經開啟的 socket
• int write(int sockfd, char *buf, int len);
引數 說明sockfd socket 函數執行後傳回的 socket ID
buf 指向字元暫存器的指標,用來存放讀取到的資料len 欲讀取的字元長度。
Function Call (cont.)
• write()– Ex:#include <sys/socket.h>Char buf[MAX_PATH] = “HelloWorld”;write(sockfd, buf, sizeof(buf));
傳回值:成功:傳回寫入的字元數。失敗:傳回 -1 。
Function Call (cont.)
• 從已經開啟的 socket 讀取資料
• int read(int sockfd, char *buf, int len);
引數 說明sockfd socket 函數執行後傳回的 socket ID
buf 指向字元暫存器的指標,用來存放讀取到的資料len 欲讀取的字元長度。
Function Call (cont.)
• read()– Ex:#include <sys/socket.h>Char buf[MAX_PATH];read(sockfd, buf, sizeof(buf));
傳回值:成功:傳回接收的字元數。失敗:傳回 -1 。
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 訊號中斷
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 。
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 訊號中斷
Function Call (cont.)
• recv()– Ex:#include <sys/types.h>#include <sys/socket.h>Char buf[MAX_PATH];recv(sockfd, buf, sizeof(buf), 0);
傳回值:成功:傳回接收的字元數。失敗:傳回 -1 。
Function Call (cont.)
• 呼叫 close() 終止 client 端和 server 端的連線。
• int close(int sockfd);
引數 說明sockfd socket 函數執行後傳回的 socket ID
Function Call (cont.)
• close()– Ex:#include <unistd.h>int close(int sockfd);
傳回值:成功:傳回 0 。失敗:傳回 -1 。
Outline
• Introduction• Function Call• Design
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() 函數 )
Design (cont.)
• TCP 程式設計流程socket
bind
listen
accept
wait
read
write
close
connect
write
read
close
socketServer
Client
建立連線
請求資料
回應請求
Thanks