Linux socket 本地程序間通訊

2021-07-10 03:31:16 字數 2757 閱讀 8696

socket起源於unix,而unix/linux基本哲學之一就是「一切皆檔案」,都可以用「開啟open –> 讀寫write/read –> 關閉close」模式來操作。socket就是該模式的乙個實現, socket即是一種特殊的檔案,一些socket函式就是對其進行的操作(讀/寫io、開啟、關閉).

說白了socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

注意:其實socket也沒有層的概念,它只是乙個facade設計模式的應用,讓程式設計變的更簡單。是乙個軟體抽象層。在網路程式設計中,我們大量用的都是通過socket實現的。

使用套接字除了可以實現網路間不同主機間的通訊外,還可以實現同一主機的不同程序間的通訊,且建立的通訊是雙向的通訊。socket程序通訊與網路通訊使用的是統一套介面,只是位址結構與某些引數不同。

其主要流程如下:

一. 建立socket

建立socket,型別為af_local或af_unix,表示用於程序通訊:

呼叫函式socket(),其原型如下:

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

引數:domain:指定協議族,對於本地套接字來說,值必須設定為af_unix列舉值;

type:指定套接字型別,可以被設定為sock_stream(流式套接字)活sock_dgram(資料報式套接字)

protocol:指定具體的協議,應被設定為0

返回值為生成的套接字描述符。

對於本地套接字來說,流式套接字(sock_stream)是乙個有順序的、可靠的雙向位元組流,相當於在本地程序之間建立起一條資料通道;資料報式套接字(sock_dgram)相當於單純的傳送訊息,在程序通訊過程中,理論上可能會有資訊丟失、複製或者不按先後次序到達的情況,但由於其在本地通訊,不通過外界網路,這些情況出現的概率很小。

二. 設定socket引數

sock_stream式本地套接字的通訊雙方均需要有本地位址,其中伺服器端的本地位址需要明確指定,指定方法是使用struct sockaddr_un型別的變數

struct sockaddr_un

// 設定伺服器引數

srv_addr.sun_family=af_unix;

strncpy(srv_addr.sun_path,can_service,sizeof(srv_addr.sun_path)-1);

unlink(can_service);

// 繫結socket位址

ret=bind(socket_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1)

// 監聽

ret=listen(socket_fd,1);

if(ret==-1)

// 接受connect請求

len=sizeof(clt_addr);

accept_fd=accept(socket_fd,(struct sockaddr*)&clt_addr,&len);

if(accept_fd<0)

// 讀取和寫入

memset(recv_buf,0,1024);

int num=read(accept_fd,recv_buf,sizeof(recv_buf));

printf("message from client (%d)) :%s\n",num,recv_buf);

// 關閉socket

close(accept_fd);

close(socket_fd);

unlink(can_service);

return 0;

}2. 客戶端

#include #include #include #include #define can_service "can_service" 

int main(void)

srv_addr.sun_family=af_unix;

strcpy(srv_addr.sun_path,can_service);

// 連線到伺服器

ret=connect(socket_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1)

memset(snd_buf,0,1024);

strcpy(snd_buf,"message from client");

// 讀取和寫入

write(socket_fd,snd_buf,sizeof(snd_buf));

close(socket_fd);

return 0;

}

gcc -o service service.c 

gcc -o client client.c

執行與本地套接字相對應的是網路套接字,可以用於在網路上傳送資料,換言之,可實現不同機器上的程序通訊過程。在 tcp/ip 協議中,ip 位址的首位元組為 127 即代表本地,因此本地套接字通訊可以使用 ip 位址為 127.x.x.x 的網路套接字來實現。❤sl

Linux socket本地程序間通訊之UDP

看了其他的很多是tcp方式,斷開重連存在問題,個人感覺沒這個方便,這裡進行記錄。當套接字用於本地通訊時,可以使用結構體struct sockaddr un描述乙個本地位址。1 struct sockaddr un 在本地通訊中,每個套接字檔案代表乙個本地位址。unix域使用者資料報套接字伺服器端流程...

linux socket程序通訊

socket程序通訊與網路通訊使用的是統一套介面,只是位址結構與某些引數不同。一。建立socket服務端的流程如下 1 建立socket,型別為af local或af unix,表示用於程序通訊 int server fd int client fd client file descriptor s...

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...