1. 程式人生 > >UNIX域Socket名稱空間

UNIX域Socket名稱空間

socket程序通訊命名方式有兩種:1、普通名稱空間  2、抽象名稱空間

1、普通名稱空間:

socket會根據此命名建立一個同名的socket檔案,客戶端連線的時候讀取該socket檔案連結到socket服務端。

此名稱空間卻又如下3個問題

問題1:

這種方式的弊端是服務必須對socket檔案的路徑具備寫許可權,客戶端必須知道socket檔案路徑,且必須對讀路徑有讀許可權。

問題2:

bind之後,會在檔案系統中留下一個檔案,然後再close,此檔案卻不會自動消失,這就導致下一次會失敗,所以AF_UNIX域socket的bind通常有個unlink()湊熱鬧。

問題3:

這個檔案很容易被其他程式不經意中刪除,這導致很奇怪的問題,而很難發現。

2、抽象名稱空間:

這種方式不需要建立socket檔案,只需要命名一個全域性名字,即可讓客戶端根據此名字進行連結,此方式中對結構成員sun_path陣列賦值時,必須把第一個位元組置0,即sun_path[0]=0。簡單的說,即時linux在內村中維護了一個虛擬的“檔案系統”。這個檔案在close之後會自動消失,並且檔案系統中看不到bind的socket檔案,在linux下用命令:netstat -an卻有記錄。

注意:sun_path[0]='\0'(需字元)。同時在使用這個地址時,必須在anddresslen引數中指定正確的長度,這個長度是sizeof(sun_family)+strlen(path)。其中path不包含後面的'\0',linux也不會去尋找這個零字元。

當接收accept()/recvfrom()資料時,linux也不會在sun_path後面附上一個'\0',所以必須根據返回的長度謹慎地處理字串。

第一種方式:

server_addr.sun_family=AF_UNIX;
strcpy(server_addr.sun_path,server_name);
server_len=sizeof(struct sockaddr_un);
client_len=server_len;

第二種方式:

server_addr.sun_family=AF_UNIX;
strcpy(server_addr.sun_path,server_name);
server_addr.sun_path[0]=0;
server_len=strlen(server_name)+offsetof(struct sockaddr_un,sun_path);
其中offsetof()函式在#include<stddef.h>標頭檔案中定義。因第二種方式的首位元組置0,我們可以在命名字串server_name前新增一個佔位字串,例如:

#define server_name "@socket_server"

注意:名稱空間

NAMESPACE_RESERVED :就是init.c中/dev/socket/下建立的socket檔案。

NAMESPACE_FILESYSTEM:普通名稱空間

NAMESPACE_ABSTRACT:虛擬名稱空間

相關推薦

UNIXSocket名稱空間

socket程序通訊命名方式有兩種:1、普通名稱空間  2、抽象名稱空間 1、普通名稱空間: socket會根據此命名建立一個同名的socket檔案,客戶端連線的時候讀取該socket檔案連結到soc

函數作用名稱空間

未定義 函數的調用 oca assign 需要 無法 () 是什麽 影響 函數作用域與名稱空間 首先我們看看下面的代碼: a = 10 def f1(): print(a) f1() 10 #不會報錯 a = 10 def f1(): print(a

作用名稱空間的坑

1. 名稱空間 1.1 什麼是名稱空間 Namespace名稱空間,也稱名字空間,是從名字到物件的對映。Python中,大部分的名稱空間都是由字典來實現的,但是本文的不會涉及名稱空間的實現。名稱空間的一大作用是避免名字衝突: ?

python 作用名稱空間

  def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spam = "nonlocal spam"

JavaScript踩坑筆記03---作用名稱空間

作用域: 作用域,顧名思義,作用的區域,也就是變數和函式的作用的區域。 作用域的作用就是隔離變數,不同作用域下同名變數不會有衝突。 舉例說明。 // 在函式fn外部定義一個字串 var str = "Hello"; function fn() { // 在函式fn內部再定義一個字串

作用名稱空間

名稱空間: 用來存放名字(變數, 函式名, 類名, 引入的模組名)的 1. 全域性名稱空間: 我們在py檔案中自己寫的變數, 函式..... 2. 內建名稱空間: 我們python直譯器提供好的一些內建內容(print, input....) 3. 區域性名稱空間: 在我們執行函式的時候.會產生一個區域性

Python的變數作用名稱空間和作用的區別、This inspection detects shadowing names defined in outer scopes警告解決

Python的變數作用域: L(local)區域性作用域: 區域性變數:包含在def關鍵字定義的函式中,即在函式中定義的變數。每當函式被呼叫時都會建立一個新的區域性作用域。在函式內部的變數宣告,除非特別的使用global關鍵字宣告為其全域性變數,否則均預設為區域性變數。

Python中的變數作用名稱空間(LEGB)

Python 使⽤LEGB的順序來查詢⼀個符號對應的物件locals    ->   enclosing    function    ->   globals    ->    builtins區域性變數———閉包空間———全域性變數———內建模組a =

unixsocket繫結路徑不建立檔案問題[c語言]

unix域socket繫結地址時,需要指定一個檔案路徑,存在兩種情況: (1)socket自動建立一個bind指定的檔案路徑對應的檔案  (2)不需要建立socket檔案,只需要命名一個全域性名字即可讓客戶端根據此名字進行連線。後者的實現過程與前者的差別是,後者在對地址結構

11、函數對象、函數的嵌套、名稱空間與作用

() update 啟動 nbsp money 有效 產生 strip() return 一、函數對象   函數對象,函數是第一類對象,即函數可以當做數據傳遞   具體特點:     1、可以被引用;   1 def foo(): 2 print(‘from fo

名稱空間與作用

引用 efi 執行 error: 有效 域名 內部 內部函數 沒有 一、名稱空間 名稱空間分三種: 內置名稱空間 Python解釋器自帶的名字,Python解釋器啟動就會生成內置名稱空間 全局名稱空間 文件級別定義的名字(頂頭寫,無縮進),都會存放在全局名稱空間,

python基礎之名稱空間和作用、函數嵌套

空間 dir pri 引用 value log 關系 fun ret 一、名稱空間 1、定義:存放名字與值的綁定關系 2、名稱空間分為:內置名稱空間、全局名稱空間、局部名稱空間 內置名稱空間:python解釋器自帶的名字,python解釋器啟動就會生成 全局名稱空間:文件級

Python__名稱空間與作用

pytho foo 自帶 glob from 解釋器 變量 bar 如果 一:函數嵌套,在調用一個函數的過程中,又調用了其他函數 def bar(): print(‘from bar‘)def foo(): print(‘from foo‘) bar()f

九、名稱空間、作用

有效 uil brush light 全局 向上 內部 外部 沒有 名稱空間   就是存放名字的一個地方 a = 1 開辟內存,存入1,a 指向 1的內存地址 a存放在名稱空間,存的是a和1的綁定關系   三種名稱空間:   一、內置名稱空間 python自帶的都存

python-之名稱空間與作用、閉包函數、嵌套函數

文件的 執行文件 全局 brush 名字查找 在哪裏 位置 opened tin 一、名稱空間與作用域 名稱空間:存放名字的地方,準確的說名稱空間是存放名字與變量值綁定關系的地方 內置名稱空間:在python解釋器啟動時產生,存放一些python內置的名字

函數對象、函數嵌套、名稱空間與作用、裝飾器

choice strong .get make wrap strip 內置模塊 正是 rand 一 函數對象 一 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #3 可以當作容器類型的元素

名稱空間與作用

如果 固定 無法 函數 bsp spa turn function 表名 一 名稱空間?   一、 什麽是名稱空間?   二、 名稱空間的加載順序   三、名字的查找順序 二 作用域   一、作用域即範圍   二、作用域關系是在函數定義階段就已經固定的,與函數的

第六篇 函數對象、函數嵌套、名稱空間與作用、裝飾器

max 數據 多分支 數據傳遞 nbsp urn int clas 什麽 一、函數對象 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #4 可以當作容器類型的元素 利用

python之旅:函數對象、函數嵌套、名稱空間與作用、裝飾器

分支 名稱空間 數據 返回值 特性 bsp 對象 body clas 一、函數對象 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #3 可以當作容器類型的元素 # 利用該特性,優雅的取代多

(十五)名稱空間與作用

名稱 CA str local int print 銷毀 oba 關閉 名稱空間和作用域 名稱空間(namespace) 是存放名字與值綁定關系的地方 分類: 內置名稱空間 存放python解釋器內置名字,比如內置函數名:len, max,sum. 創建:隨著pyt