Socket 如何運作

Socket 通常用於用戶端和伺服器互動。 一般系統配置會將伺服器放在一部機器上,而用戶端則放在其他機器上。 用戶端會連接至伺服器,交換資訊,然後中斷連線。

Socket 具有一般事件流程。 在連線導向用戶端至伺服器模型中,伺服器處理程序上的 Socket 會等待來自用戶端的要求。 若要這樣做,伺服器會先建立 (連結) 用戶端可用來尋找伺服器的位址。 當建立位址時,伺服器會等待用戶端要求服務。 當用戶端透過 Socket 連接至伺服器時,會進行用戶端至伺服器資料交換。 伺服器會執行用戶端的要求,並將回覆傳回用戶端。

附註: 目前 IBM 支援兩個版本的大部分 Socket API。 預設 IBM® i Socket 使用 Berkeley Socket Distribution (BSD) 4.3 結構和語法。 其他版本的 Socket 使用與 BSD 4.4 及 UNIX 98 程式設計介面規格相容的語法及結構。 程式設計師可以指定 _XOPEN_SOURCE 巨集來使用 UNIX 98 相容介面。

下圖顯示連線導向 Socket 階段作業的一般事件流程 (以及發出的 API 順序)。 下圖後面是每一個事件的說明。

這兩個端點會建立連線,並將用戶端與伺服器連接在一起。

這是連線導向 Socket 的一般事件流程:

  1. socket() API 會建立用於通訊的端點,並傳回代表該端點的 Socket 描述子。
  2. 當應用程式具有 Socket 描述子時,它可以將唯一名稱連結至 Socket。 伺服器必須連結名稱,才能從網路存取。
  3. listen() API 指出願意接受用戶端連線要求。 針對 Socket 發出 listen() API 時,該 Socket 無法主動起始連線要求。 在使用 socket() API 配置 Socket 且 bind() API 將名稱連結至 Socket 之後,即會發出 listen() API。 在發出 accept() API 之前,必須先發出 listen() API。
  4. 用戶端應用程式在串流 Socket 上使用 connect() API 來建立與伺服器的連線。
  5. 伺服器應用程式使用 accept() API 來接受用戶端連線要求。 伺服器必須先順利發出 bind()listen() API ,然後才能發出 accept() API。
  6. 在串流 Socket 之間 (在用戶端與伺服器之間) 建立連線時,您可以使用任何 Socket API 資料傳送 API。 用戶端及伺服器有許多可供選擇的資料傳送 API ,例如 send()recv()read()write()及其他。
  7. 當伺服器或用戶端想要停止作業時,它會發出 close() API ,以釋放 Socket 所獲得的任何系統資源。
附註: Socket API 位於應用程式層與傳輸層之間的通訊模型中。 Socket API 不是通訊模型中的層。 Socket API 可讓應用程式與一般通訊模型的傳輸或網路層互動。 下圖中的箭頭顯示 Socket 的位置,以及 Socket 提供的通訊層。
通訊層中 Socket 的位置

通常,網路配置不容許安全內部網路與較不安全外部網路之間的連線。 不過,您可以讓 Socket 與在防火牆之外的系統上執行的伺服器程式 (非常安全的主機) 進行通訊。