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...