先引用一張Richard Stevens大師的圖
來了解一下client-server架構下的程式流程
此圖是connection-oriented的流程
以網路程式設計來說,就是使用TCP
[Server端]
a. 使用socket函數,建立socket
此步要提供socket函數三個重要的參數
Domain, Type, Protocol
Domain 決定socket底下傳輸的媒介是什麼
一般最常使用的是AF_UNIX和AF_INET
Type 決定傳輸的性質是什麼
一般最常使用的是SOCK_STREAM和SOCK_DGRAM
Protocol 則是決定要在(domain, type)的組合底下
要使用哪一個protocol,一般給0表示使用預設值
socket函數成功執行的話會回傳該 socket的 file descriptor
b. 使用bind函數,將建立好的socket命名(naming)
用命名這個直翻的中文名詞有點詞不達意的感覺
說穿了,建立好的socket和賦好值的address
會被bind函數bind起來 (bind有結合的意思)
int bind( int sockfd, struct sockaddr* address, size_t len);
*這裡的address在書上寫可以設定允許連進來server的客戶*
這句話似乎有點問題
因為將address->sin_addr設定為INADDR_ANY
其實是表示server上面任何一個interface都接受連線
並非表示所有的客戶都能連線
意義不同,需注意!
c. 使用listen函數,設定儲存pending requests的queue的大小
例如 listen(sockfd, 5);
注意此處設定的數字5是儲存pending requests的數目
而不是server總共可以服務多少人
也不是表示同時間可以服務多少人
d. 使用accept函數,準備接受client連線的要求
int accpet(int sockfd, struct sockaddr* client_addr, size_t len);
accept函數成功執行的話,會回傳一個socket file descriptor
以後就是利用這個socket fd跟client溝通
另外client address的資料也會存到client_addr中
這邊就是看server要不要使用這個資訊了
accept會等待連線請求而block
e. 使用read, write函數,與client進行資料的交換
f. 使用close函數,結束掉socket 的使用
[Client端]
a. 使用socket函數,建立socket
原理同server建立socket
只是這邊是建立client端自己的socket
b. 使用connect函數,連線到提供服務的 server
這個函數功能很簡單
就是對server提出連線的要求
該server的accept函數會處理我們connect函數所發出的request
c. 使用read, write函數,與 server進行資料的交換
d. 使用close函數,結束掉socket 的使用
[Reference]
Unix Network Programming Vol.1 3rd edition - Prentice Hall
Begining Linux Programming 4th edition - Wrox
沒有留言:
張貼留言