12/20 賴宗遠學長Socket PPT

Download Report

Transcript 12/20 賴宗遠學長Socket PPT

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 ID
addr
指向struct sockaddr_in結構的指標,用來存放client端的IP
address
addrlen
存放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 ID
serv_addr
指向struct sockaddr_in結構的指標,用來存放server的
address1
addrlen
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程式設計流程
Client
Server
socket
socket
wait
建立連線
bind
read
請求資料
listen
connect
write
write
read
accept
close
回應請求
close
Thanks