網路與通訊端

socket 與 connect(客戶端呼叫)

如果伺服器是那家開門等待的店,客戶端就是穿越城市、上門敲門的顧客。TCP 程式的客戶端短得令人愉快:建立一個端點,然後伸手連向一個已知的位址。兩個呼叫就能辦到——socket() 建立端點、connect() 撥號給伺服器。

細看:socket() 建立端點並給你一個檔案描述符,和伺服器端完全一樣。接著 connect() 取走那個通訊端與伺服器的位址(它的 IP 與連接埠),並發起連線——在幕後,這會與伺服器進行三向交握。若成功,connect() 回傳,你的通訊端如今成了一個已連線的通訊端:你可以對它做 send() 與 recv()(或 read() 與 write())來交換位元組串流。客戶端通常不呼叫 bind(),因為它不在乎自己用哪個本地連接埠——作業系統會自動挑一個空閒的(短暫連接埠,ephemeral port)。它只需要連得到伺服器那個眾所周知的連接埠。

為何重要:這是你最常用到的那一半通訊端程式設計,因為多數程式都是客戶端——你的瀏覽器、你的郵件程式、一個抓取 API 的指令稿,全都是在某處呼叫 connect() 的客戶端。誠實的提醒:connect() 可能失敗(沒有伺服器在聆聽、主機不可達、被拒絕),所以你必須永遠檢查它的回傳值;而 connect() 在交握期間可能阻塞一陣子,一旦你在意反應速度與逾時,這就很重要。

int s = socket(AF_INET, SOCK_STREAM, 0); if (connect(s, &server_addr, sizeof server_addr) < 0) { perror("connect"); exit(1); } /* 現在 s 已連線:可 send()/recv() */ 兩個呼叫,加上一次回傳值檢查,你就在和伺服器交談了。

客戶端只要建立一個通訊端並 connect();作業系統會替它挑一個本地連接埠。

connect() 失敗是正常的、不是例外——伺服器可能關機,或連接埠關閉。把失敗的 connect() 當成預期中要處理的結果,絕不要假設它成功了。

又称
client-side socket callsactive open客戶端通訊端呼叫