第一步:調用socket函數建立套接字
domain:套接字使用的協定族(Protocol Family)資訊;
type:套接字資料傳輸類型資訊;
protocol:計算機間通信中使用的協定資訊;
協定族(Protocol Family)
套接字類型(Type):是指套接字的傳輸方式
面向連接配接的套接字(SOCK_STREAM)
傳輸過程中資料不會消失
按序傳輸資料
傳輸的資料不存在資料邊界(Boundary):調用了三次write傳遞了100位元組,接受者僅一次read接收了全部
面向消息的套接字(SOCK_DGRAM)
強調快速傳輸而非傳輸順序
傳輸的資料可能丢失也可能損毀
傳輸的資料有資料邊界
限制每次傳輸的資料大小
協定的最終選擇
第二步:調用bind函數配置設定IP位址和端口号
__fd:要配置設定位址資訊(IP位址和端口号)的套接字檔案表述符。
__addr:存有位址資訊的結構體變量位址值
__len:第二個結構體變量的長度
第三步:調用listen函數轉為可接收請求狀态
__fd:希望進入等待連接配接請求狀态的套接字檔案描述符,傳遞的描述符套接字參數成為伺服器端套接字(監聽套接字)。
__n:連接配接請求等待隊列的長度。
第四步:調用accept函數受理連接配接請求
__fd:伺服器套接字的檔案描述符。
__addr:儲存發起連接配接請求的用戶端位址資訊地變量位址值,調用函數後向傳遞來的位址變量參數填充用戶端的位址資訊。
__addr_len:第二個參數__addr結構體的長度,但是存有長度的變量位址。函數調用完後,該變量即被填入用戶端位址長度。
第二步:調用socket函數向伺服器端發送連接配接請求
__fd:用戶端套接字檔案表述符。
__addr:儲存目标伺服器端位址資訊的變量位址值。
__len:以位元組為機關傳遞已傳遞給第二個結構體參數__addr位址變量長度。
用戶端調用connect函數後服務端接收連接配接請求(記錄到等待隊列)或發生斷網等異常情況而中斷連接配接請求才會傳回(完成函數調用)。用戶端的IP位址和端口号在調用connect函數時由核心自動配置設定,無需調用标記的bind函數進行配置設定。
總體流程就是:伺服器端建立套接字後聯系調用bind、listen函數進入等待狀态,用戶端通過調用connect函數發起連接配接請求,需要注意的是,用戶端隻能等到伺服器端調用listen函數後才能調用connect函數。同時要清楚,用戶端調用connect前,伺服器端可能先調用了accept函數。當然,此時伺服器端在調用accept函數時進入了阻塞狀态,直到用戶端調用connect函數為止。
I/O緩沖在每個TCP套接字中單獨存在;
I/O緩沖在建立套接字時自動生成;
即使關閉套接字也會繼續傳遞輸出緩沖中遺留的資料;
關閉套接字将丢失輸入緩沖中的資料;
echosrv.c
echocli.c