通訊端與網路程式設計

連接通訊端(connecting a socket)

如果伺服器是守在電話旁的店家,連接就是顧客撥那家店的號碼。connect 是用戶端的呼叫,它伸手觸及某個特定的伺服器位址與埠,對 TCP 而言並建立起對話。它是主動開啟者——發起的那一方——對應伺服器被動的傾聽與接受。

程式碼裡,建立通訊端後你呼叫 connect(fd, server_address),給出目的 IP 與埠。對 TCP 通訊端,這會觸發三向交握:你的機器送出 SYN、伺服器回 SYN-ACK、你的機器送出最後的 ACK,之後連線便建立,你就能 send 與 recv 位元組。你通常不先呼叫 bind——作業系統會自動為你指派一個臨時來源埠。對 UDP 通訊端,connect 是選用的、也較輕:它不送任何封包、也不建立真正的連線;它只是記下一個預設目的端,好讓你能用單純的 send/recv,不必在每次 sendto 重複地址,並把進來的資料報過濾成只收那一個對端。

為什麼重要:connect 是幾乎每個用戶端做的第一件事,所以它的失敗模式是日常的程式現實。它可能很快以「connection refused(連線被拒)」失敗(那個埠上沒有東西在傾聽),或卡住然後逾時(主機無法觸及,或防火牆默默丟棄封包)。在阻塞式通訊端上,connect 會等完整個交握才回傳;在非阻塞式通訊端上它立刻回傳,你之後再用 select、poll 或 epoll 完成連線——這是用戶端同時開許多連線而不凍結的標準做法。

用戶端執行 fd = socket(...);connect(fd, {93.184.216.34, 443})。作業系統悄悄挑一個臨時來源埠,三向交握跑完,connect 回傳成功——此後 send 與 recv 承載這段對話。

用戶端撥號;作業系統自動提供回傳用的埠。

「connection refused」與「connection timed out」意思不同:refused 是主機主動回說沒有埠在傾聽;timed out 通常代表封包根本沒收到任何回應(主機掛了,或防火牆在丟封包)。

又称
connect()active openclient connect連線主動開啟