程序間通訊(Sockets)


程序間通訊是由作業系統提供的機制,允許程序之間相互通訊。這種通訊可能包括一個程序讓另一個程序知道某個事件已經發生,或者將資料從一個程序傳輸到另一個程序。

使用套接字是管理程序間通訊的一種方法。它們提供兩個程序之間的點對點雙向通訊。套接字是通訊的端點,可以繫結名稱。一個套接字可以與一個或多個程序關聯。

套接字型別

套接字的型別如下:

  • 順序分組套接字:這種型別的套接字為資料報提供可靠的連線,資料報的最大長度是固定的。此連線是雙向的,並且是有序的。

  • 資料報套接字:資料報套接字支援訊息的雙向流動。在資料報套接字中,接收方可能接收到的訊息順序與傳送順序不同。資料報套接字的操作類似於透過郵件將信件從源傳遞到目的地的操作。

  • 流套接字:流套接字的操作類似於電話交談,並提供雙向可靠的資料流,沒有記錄邊界。此資料流也是有序的且不重複的。

  • 原始套接字:可以使用原始套接字訪問底層通訊協議。

套接字建立

可以使用以下宣告在特定域和特定型別中建立套接字:

int socket(int domain, int type, int protocol)

如果在上述系統呼叫中未指定協議,則系統使用支援套接字型別的預設協議。返回套接字控制代碼,它是一個描述符。

bind 函式呼叫用於將網際網路地址或路徑繫結到套接字。如下所示:

int bind(int s, const struct sockaddr *name, int namelen)

連線流套接字

連線流套接字不是對稱的過程。一個程序充當伺服器,另一個程序充當客戶端。伺服器使用以下宣告指定可以排隊的連線請求數:

int listen(int s, int backlog)

客戶端使用以下宣告啟動與伺服器套接字的連線:

int connect(int s, struct sockaddr *name, int namelen)

以下宣告返回對該特定連線有效的新的套接字描述符:

int accept(int s, struct sockaddr *addr, int *addrlen)

流資料傳輸

send() 和 recv() 函式用於使用套接字傳送和接收資料。它們類似於 read() 和 write() 函式,但包含一些額外的標誌。send() 和 recv() 的宣告如下:

int send(int s, const char *msg, int len, int flags)
int recv(int s, char *buf, int len, int flags)

關閉流

透過呼叫 close() 來丟棄或關閉套接字。

更新於:2020年6月24日

5K+ 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.