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