linux socket程序通訊

2021-06-04 23:11:23 字數 3555 閱讀 8398

socket程序通訊與網路通訊使用的是統一套介面,只是位址結構與某些引數不同。

一。建立socket服務端的流程如下:

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

int server_fd;

int client_fd;//client file descriptor

struct sockaddr_un server_addr;

struct sockaddr_un client_addr;

size_t server_len,client_len;

//cteate server socket

//delete old socket file

unlink(server_name);

if ((server_fd = socket(af_unix, sock_stream, 0)) == -1)

(2)命名socket。這裡面有乙個很關鍵的東西,socket程序通訊命名方式有兩種。一是普通的命名,socket會根據此命名建立乙個同名的socket檔案,客戶端連線的時候通過讀取該socket檔案連線到socket服務端。這種方式的弊端是服務端必須對socket檔案的路徑具備寫許可權,客戶端必須知道socket檔案路徑,且必須對該路徑有讀許可權。另外一種命名方式是抽象命名空間,這種方式不需要建立socket檔案,只需要命名乙個全域性名字,即可讓客戶端根據此名字進行連線。後者的實現過程與前者的差別是,後者在對位址結構成員sun_path陣列賦值的時候,必須把第乙個位元組置0,即sun_path[0] = 0,下面用**說明:

第一種方式:

//name the server socket 

server_addr.sun_family = af_unix;

strcpy(server_addr.sun_path,server_name);

server_len = sizeof(struct sockaddr_un);

client_len = server_len;

第二種方式:

//name the socket

server_addr.sun_family = af_unix;

strcpy(server_addr.sun_path, server_name);

server_addr.sun_path[0]=0;

//server_len = sizeof(server_addr);

server_len = strlen(server_name) + offsetof(struct sockaddr_un, sun_path);

其中,offsetof函式在#include 標頭檔案中定義。因第二種方式的首位元組置0,我們可以在命名字串server_name前新增乙個佔位字串,例如:

#define server_name @socket_server
前面的@符號就表示佔位符,不算為實際名稱。

或者可以把第二種方式的實現封裝成乙個函式:

int makeaddr(const char* name, struct sockaddr_un* paddr, socklen_t* psocklen)

像下面這樣使用這個函式:

makeaddr("server_socket", &server_addr, &server_len);

(3)繫結並偵聽

bind(server_sockfd, (struct sockaddr *)&server_addr, server_len);

//listen the server

listen(server_sockfd, 5);

(4)等待客戶端連線,並讀寫資料。

while(1)

二 socket客戶端建立流程

(1)建立socket

(2)命名socket

(3)連線到服務端:

//connect to server

result = connect(sockfd, (struct sockaddr*)&address, len);

(4)與服務端進行通訊

//communicate with server socket

while(1)

完整**如下:

(1)服務端server.c:

#include#include#include#include#include#include#include #define server_name "@server_socket"

/* * create a unix-domain socket address in the linux "abstract namespace".

* * the socket code doesn't require null termination on the filename, but

* we do it anyway so string functions work.

*/int makeaddr(const char* name, struct sockaddr_un* paddr, socklen_t* psocklen)

int main()

//read data from client socket

nread = read(client_sockfd, &ch, 1);

if(nread == 0)

else

usleep(100);//1000 miliseconds = 1 second

}return 0;

}

(2)客戶端client.c

#include#include#include#include#include#include#include #define server_name "@server_socket"

/* * create a unix-domain socket address in the linux "abstract namespace".

* * the socket code doesn't require null termination on the filename, but

* we do it anyway so string functions work.

*/int makeaddr(const char* name, struct sockaddr_un* paddr, socklen_t* psocklen)

int main()

//communicate with server socket

while(1)

exit(0);

}

Linux socket 本地程序間通訊

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

Linux socket本地程序間通訊之UDP

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

linux socket通訊原始碼

初學socket通訊,參考的是linuxc程式設計大全的23章的23 5例子,但是發現這個例子原始碼裡有好幾處錯誤,因為初學,很多不懂,吃了虧,因此將修改後能正常執行的 記錄在這裡 參考 server.c include include include include include include...