浅谈Unix域套接字

代码 代码 961 人阅读 | 0 人回复

<
文章目次



欢送会见我的小我私家专客

专客
弁言

正在 Linux 中有很多停止 历程间通讯 的办法。今日专主背各人引见一种经常使用的历程间通讯的办法 ——Unix 域套接字。
简介

Unix 域套接字 是一种正在本机的历程间停止通讯的一种办法。固然 Unix 域套接字的接心取 TCP 战 UDP 套接字 的接心非常类似,可是 Unix 域套接字只能用于统一台机械的历程间通讯,不克不及让两个位于差别机械的历程停止通讯。正因为那个特征,Unix 域套接字能够牢靠天正在两个历程间复造数据,不用像 TCP 一样接纳一些诸如 * 增加收集报头 计较查验战 发生挨次号 * 等一系列包管数据完好性的操纵。因而,正在统一台机械长进止历程间通讯时,Unix 域套接字的服从常常比 TCP 套接字的服从要下。
由于 Unix 域套接字的服从比力下,一些程序常常用 Unix 套接字替代 TCP 套接字。比方当 MySQL 的效劳器历程战客户端历程正在统一台机械上时,能够用 Unix 域套接字替代 TCP 套接字。
Unix 域套接字地点构造

正在利用 TCP 套接字战 UDP 套接字时,我们需求用 struct sockaddr_in(IPv4)界说套接字的地点构造,取之类似,Unix 域套接字利用 struct sockaddr_un 界说套接字的地点构造。struct sockaddr_un 的界说以下(* 位于头文件 sys/un.h 中 *):
  1. struct sockaddr_un
  2. {
  3.     sa_family_t sun_family;
  4.     char sun_path[108];
  5. };
复造代码
正在利用 Internet 域套接字停止编程时,需求将 struct sockaddr_in 的 sin_family 成员设置为 AF_INET(IPv4)。取之相似,正在利用 Unix 域套接字时,需求将 sun_family 设置为 AF_UNIX 或 AF_LOCAL(* 那两个宏的感化完整不异,皆暗示 UNIX 域 *)。struct sockaddr_un 的第两个成员 sun_path 暗示 socket 的地点。正在 Unix 域中,socket 的地点用途径名暗示。比方,能够将 sun_path 设置为 /tmp/unixsock。因为途径名是一个字符串,以是 sun_path 必需可以包容字符串的字符战末端的 &#39;\0&#39;。需求留意的是,标准并出有划定 sun_path 的巨细,正在某些仄台中,sun_path 的巨细多是 104、92 等值。以是假如需求包管可移植性,正在编码时该当利用 sun_path 的最小值。
创立 Unix 域套接字

Unix 域套接字利用 socket 函数创立,取 Internet 域套接字一样,Unix 域套接字也有流套接字战数据报套接字两种:
  1. int unix_sock_fd1 = socket(AF_UNIX, SOCK_STREAM, 0); // Unix 域中的流 socket
  2. int unix_sock_fd2 = socket(AF_UNIX, SOCK_DGRAM, 0); // Unix 域中的数据包 socket
复造代码
稍后将引见那两种套接字的用法战区分。
绑定 Unix 域套接字

利用 bind 函数能够将一个 Unix 套接字绑定到一个地点上。绑定 Unix 域套接字时,bind 会正在指定的途径名处创立一个暗示 Unix 域套接字的文件。Unix 域套接字取途径名是逐个对应干系,即一个 Unix 域套接字只能绑定到一个途径名上,一个途径名也只能被一个套接字绑定。普通要把 Unix 域套接字绑定到一个 尽对途径 上,比方:
[code]struct sockaddr_un addr;addr.sun_family = AF_LOCAL;strcpy(addr.sun_path, "/tmp/sockaddr");int unix_sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);if (bind(unix_sock_fd, (struct sockaddr *)&addr, sizeof(addr)) <span class="token operator">
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则