unix domain socket

socket,大家可能都比较熟悉,通常指的是 network socket,或者 Internet Socket(IP Socket),是 unix 网络编程的基础概念。
了解网络编程的开发人员在选择进程间通信机制时,一般都倾向于 IP sockets over localhost,即在回路(loopback)接口地址上,更不讲究的,就会使用内网地址,其通信机制就是一个典型、完整的网络通信。
本文介绍一下 Unix domain socket,也叫 IPC socket (inter-process communication socket),即进程间通信 socket,这种机制和网络通信在本质上是完全不同的,只不过在形式上有些相似。

Socket - Client Server Model

Client and Server Interaction

UNIX domain sockets

Client-Server Interaction
  • Unix Sockets 通常指的就是 UNIX domain sockets;
unix domain socket 交互示意
client 端的过程
  • socket()
    client 创建一个 socket。
    socket() 函数返回一个 socket descriptor。单独一个 socket 没什么用,需要将这个 socket 用在后续的系统调用里,比如 bind() 就有用了。
  • bind()
    将 socket 绑定到本机一个文件 cfile,这个文件可以理解为网络编程中的IP和端口port;
    int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
    sockfd is the socket file descriptor returned by socket(). my_addr is a pointer to a struct sockaddr that contains information about your address, namely, port and IP address.
    把一个 socket 绑到 IP和port(网络编程),或者本机的一个文件上(IPC 通信),都是一个地址,别人能据此找到你。
    在网络编程中,client 端通常不需要显性 bind(),即使 bind,在 bind 中也不显性指定端口号,而由系统自主处理,因为我们并不关心本地的 port 端口号;对于 Unix domain socket,如果你需要双向通信,则 client 需要 bind。
  • connect()
    int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
    客户端连接服务器,其中 sockfd 就是你创建的那个 socket(已经绑定了 cfile),serv_addr 是 server 端的地址(结构中指定了服务器所绑定的文件 sfile,这个文件是客户端和服务端都需要事先知道的,而 cfile 不需要事先告知 server 端);
  • send()
    int send(int sockfd, const void *msg, int len, int flags);
  • recv()
    int recv(int sockfd, void *buf, int len, int flags);
    内核侦测到有数据写入 cfile 这个文件管道后(server 写入到 cfile),通过 socket 传送给 client 进程。
  • 进程接收到数据
server 端的过程
  • socket()
  • bind()
  • recvfrom()
    int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
    如果 cfile 没有事先告知服务器,则服务器要首先从 recvfrom 的 from 参数(recvfrom 函数调用后 from 参数会被赋值)获知客户端的 cfile,再 sendto,从而实现双向通信。
  • sendto()
    int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, socklen_t tolen);
参考
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 一、 概述UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC)...
    chandarlee阅读 6,727评论 0 51
  • Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程...
    Hanaasagi阅读 2,271评论 0 0
  • 概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台...
    程序手艺人阅读 7,362评论 0 4
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,224评论 0 5
  • Socket error 0 - Directly send errorSocket error 10004 - ...
    Irlans阅读 2,559评论 0 0