1.繫結:sock_stream 式本地套接字的通訊雙方均需要具有本地位址,其中伺服器端的本地位址需要明確指定,指定方法是使用 struct sockaddr_un 型別的變數,將相應字段賦值,再將其繫結在建立的伺服器套接字上,繫結要使用 bind 系統呼叫,其原形如下:
int
bind(int
socket, const struct sockaddr *address, size_t address_len);
其中 socket表示伺服器端的套接字描述符,address 表示需要繫結的本地位址,是乙個 struct sockaddr_un 型別的變數,address_len 表示該本地位址的位元組長度。
2.監聽:伺服器端套接字建立完畢並賦予本地位址值(名稱,本例中為server socket)後,需要進行監聽,等待客戶端連線並處理請求,監聽使用 listen 系統呼叫,接受客戶端連線使用accept系統呼叫,它們的原形如下:
int
listen(int
socket, int backlog);
intaccept(int
socket, struct sockaddr *address, size_t *address_len);
其中 socket 表示伺服器端的套接字描述符;backlog 表示排隊連線佇列的長度(若有多個客戶端同時連線,則需要進行排隊);address 表示當前連線客戶端的本地位址,該引數為輸出引數,是客戶端傳遞過來的關於自身的資訊;address_len 表示當前連線客戶端本地位址的位元組長度,這個引數既是輸入引數,又是輸出引數。
對於sock_stream型別的流式套接字,需要客戶端與伺服器之間進行連線方可使用。連線要使用 connect 系統呼叫,其原形為
int
connect(int
socket, const struct sockaddr *address, size_t address_len);
其中socket為客戶端的套接字描述符,address表示當前客戶端的本地位址,是乙個 struct sockaddr_un 型別的變數,address_len 表示本地位址的位元組長度。實現連線的**如下:
connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));
4.相互傳送接收資料:無論客戶端還是伺服器,都要和對方進行資料上的互動,這種互動也正是我們程序通訊的主題。乙個程序扮演客戶端的角色,另外乙個程序扮演伺服器的角色,兩個程序之間相互傳送接收資料,這就是基於本地套接字的程序通訊。傳送和接收資料要使用 write 和 read 系統呼叫,它們的原形為:
int
read(int
socket, char *buffer, size_t len);
intwrite(int
socket, char *buffer, size_t len);
其中 socket 為套接字描述符;len 為需要傳送或需要接收的資料長度;
對於 read 系統呼叫,buffer 是用來存放接收資料的緩衝區,即接收來的資料存入其中,是乙個輸出引數;
對於 write 系統呼叫,buffer 用來存放需要傳送出去的資料,即 buffer 內的資料被傳送出去,是乙個輸入引數;返回值為已經傳送或接收的資料長度。
5.斷開連線:互動完成後,需要將連線斷開以節省資源,使用close系統呼叫,其原形為:
int
close(int
socket);
程序間通訊2
什麼是訊號量 為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行程序訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問它,也...
程序間通訊方式(2)
q 訊息佇列實質及運用?a 訊息佇列就是乙個訊息的鍊錶,把訊息看作有特定格式和優先順序的記錄,該記錄包括訊息佇列鍵值,使用者 id,組 id,訊息佇列中訊息數目等,甚至可以包括對訊息佇列讀寫程序的 id。對於訊息有相應許可權的程序可以對訊息程序進行相應寫入和讀取操作 訊息佇列是隨著核心持續的。對於訊...
Linux 程序間通訊2
一 共享記憶體 1 共享記憶體是被多個程序共享的一部分物理記憶體.共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以 立刻 看到其中的內容 2.共享記憶體實現分為兩個步驟 一 建立共享記憶體,使用shmget函式 二 對映共享記憶體,將...