unix domain socket 淺析

unix domain socket

unix domain socket 是在socket架構(gòu)上發(fā)展起來的用于同一臺主機的進程間通訊(IPC: Inter-Process Communication)勺爱,它不需要經(jīng)過網(wǎng)絡協(xié)議棧,不需要打包拆包屯伞、計算校驗和、維護序號和應答等,只是將應用層數(shù)據(jù)從一個進程拷貝到另一個進程光戈。UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM兩種工作模式枷颊,類似于UDP和TCP暇仲,但是面向消息的UNIX Domain Socket也是可靠的,消息既不會丟失也不會順序錯亂疚漆。

UNIX Domain Socket可用于兩個沒有親緣關(guān)系的進程酣胀,是全雙工的,是目前使用最廣泛的IPC機制娶聘,比如X Window服務器和GUI程序之間就是通過UNIX Domain Socket通訊的闻镶。

UNIX Domain socket與網(wǎng)絡socket類似,可以與網(wǎng)絡socket對比應用丸升。

上述二者編程的不同如下:

  • address family為AF_UNIX
  • 因為應用于IPC铆农,所以UNIXDomain socket不需要IP和端口,取而代之的是文件路徑來表示“網(wǎng)絡地址”狡耻。這點體現(xiàn)在下面兩個方面墩剖。
  • 地址格式不同,UNIXDomain socket用結(jié)構(gòu)體sockaddr_un表示夷狰,是一個socket類型的文件在文件系統(tǒng)中的路徑岭皂,這個socket文件由bind()調(diào)用創(chuàng)建,如果調(diào)用bind()時該文件已存在沼头,則bind()錯誤返回爷绘。
  • UNIX Domain Socket客戶端一般要顯式調(diào)用bind函數(shù),而不象網(wǎng)絡socket一樣依賴系統(tǒng)自動分配的地址瘫证∪嘌郑客戶端bind的socket文件名可以包含客戶端的pid,這樣服務器就可以區(qū)分不同的客戶端背捌。

下面用python代碼演示uds的使用

Python代碼演示

服務端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 12/11/17 11:55 AM
@author: Chen Liang
@function: socket_echo_server_uds
"""

import sys

reload(sys)
sys.setdefaultencoding('utf-8')
import socket
import os

server_address = './uds_socket'

# Make sure the socket does not already exist
try:
    os.unlink(server_address)
except OSError:
    if os.path.exists(server_address):
        raise

# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

# Bind the socket to the address
print('starting up on {}'.format(server_address))
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

while True:
    # Wait for a connection
    print('waiting for a connection')
    connection, client_address = sock.accept()
    try:
        print('connection from', client_address)

        # Receive the data in small chunks and retransmit it
        while True:
            data = connection.recv(16)
            print('received {!r}'.format(data))
            if data:
                print('sending data back to the client')
                connection.sendall(data)
            else:
                print('no data from', client_address)
                break

    finally:
        # Clean up the connection
        connection.close()

客戶端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 12/11/17 11:55 AM
@author: Chen Liang
@function: socket_echo_client_uds
"""

import sys

reload(sys)
sys.setdefaultencoding('utf-8')


import socket
import sys

# Create a UDS socket
sock = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = './uds_socket'
print('connecting to {}'.format(server_address))
try:
    sock.connect(server_address)
except socket.error as msg:
    print(msg)
    sys.exit(1)

try:

    # Send data
    message = b'This is the message.  It will be repeated.'
    print('sending {!r}'.format(message))
    sock.sendall(message)

    amount_received = 0
    amount_expected = len(message)

    while amount_received < amount_expected:
        data = sock.recv(16)
        amount_received += len(data)
        print('received {!r}'.format(data))

finally:
    print('closing socket')
    sock.close()

客戶端一次發(fā)送毙籽,服務端分批返回。

服務端輸出結(jié)果如下

root@ubuntu:~/PycharmProjects/python_scripts# python socket_echo_server_uds.py 
starting up on ./uds_socket
waiting for a connection
('connection from', '')
received 'This is the mess'
sending data back to the client
received 'age.  It will be'
sending data back to the client
received ' repeated.'
sending data back to the client
received ''
('no data from', '')
waiting for a connection

客戶端輸出結(jié)果如下

root@ubuntu:~/PycharmProjects/python_scripts# python socket_echo_client_uds.py 
connecting to ./uds_socket
sending 'This is the message.  It will be repeated.'
received 'This is the mess'
received 'age.  It will be'
received ' repeated.'
closing socket

查看套接字文件的類型如下

root@ubuntu:~/PycharmProjects/python_scripts# ls -l ./uds_socket
srwxr-xr-x 1 root root 0 Dec 11 13:45 ./uds_socket

可見uds文件是socket類型毡庆。具體的linux文件類型有以下幾種:

Linux的文件類型有以下幾種:

文件類型 ls -l顯示
普通文件 -
目錄 d
符號鏈接 l
字符設(shè)備 c
塊設(shè)備 b
套接字 s
命名管道 p

參考:


念念不忘坑赡,必有回響烙如,小伙伴們幫我點個贊吧,非常感謝毅否。

我是職場亮哥亚铁,YY高級軟件工程師、四年工作經(jīng)驗螟加,拒絕咸魚爭當龍頭的斜杠程序員徘溢。

聽我說,進步多捆探,程序人生一把梭

如果有幸能幫到你然爆,請幫我點個【贊】,給個關(guān)注黍图,如果能順帶評論給個鼓勵曾雕,將不勝感激。

職場亮哥文章列表:更多文章

本人所有文章助被、回答都與版權(quán)保護平臺有合作剖张,著作權(quán)歸職場亮哥所有,未經(jīng)授權(quán)揩环,轉(zhuǎn)載必究搔弄!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市检盼,隨后出現(xiàn)的幾起案子肯污,更是在濱河造成了極大的恐慌,老刑警劉巖吨枉,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦渣,死亡現(xiàn)場離奇詭異,居然都是意外死亡貌亭,警方通過查閱死者的電腦和手機柬唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圃庭,“玉大人锄奢,你說我怎么就攤上這事【缒澹” “怎么了拘央?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長书在。 經(jīng)常有香客問我灰伟,道長,這世上最難降的妖魔是什么儒旬? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任栏账,我火速辦了婚禮帖族,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挡爵。我一直安慰自己竖般,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布茶鹃。 她就那樣靜靜地躺著涣雕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闭翩。 梳的紋絲不亂的頭發(fā)上胞谭,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音男杈,去河邊找鬼。 笑死调俘,一個胖子當著我的面吹牛伶棒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彩库,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼肤无,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骇钦?” 一聲冷哼從身側(cè)響起宛渐,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眯搭,沒想到半個月后窥翩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡鳞仙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年寇蚊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棍好。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡仗岸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出借笙,到底是詐尸還是另有隱情扒怖,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布业稼,位于F島的核電站盗痒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盼忌。R本人自食惡果不足惜积糯,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一掂墓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧看成,春花似錦君编、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梦重,卻和暖如春兑燥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琴拧。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工降瞳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚓胸。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓挣饥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沛膳。 傳聞我的和親對象是個殘疾皇子扔枫,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容