曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4833|回复: 0
打印 上一主题 下一主题

UNIX 域协议简介

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-11-27 15:16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Unix 域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,也就是通常说的进程间的通信(IPC)。

Unix 域用于标识客户和服务器的协议地址是普通的文件系统中的路径名,而不像常见的 IPv4 所用的 32 位地址和一个端口号,或是 IPv6 所用的 128 位地址及其端口号。

<sys/un.h> 中定义了 Unix 域套接字地址结构:
[C++] 纯文本查看 复制代码
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket.  */
struct sockaddr_un
  {
    __SOCKADDR_COMMON (sun_);
    char sun_path[108];         /* Path name.  */
  };

在 <bits/sockaddr.h> 中又有定义:
[C++] 纯文本查看 复制代码
define __SOCKADDR_COMMON(sa_prefix) \
  sa_family_t sa_prefix##family

因此,__SOCKADDR_COMMON(sun_) 展开后就是:sa_family_t sun_family; ,而 sa_family_t 则被定义为 typedef unsigned short int sa_family_t; ,是个 unsigned short int 类型。

存放在 sun_path 数组中的路径名必须以空字符结尾。

SUN_LEN 宏以一个指向 sockaddr_un 结构的指针为参数,并返回该结构的长度,其中包括路径名中非空字节数,如指定的文件名为 /tmp/unix.soktmp ,那么获得的长度为 18,即文件全路径共 16 个字节,unsigned short int 类型 2 个字节,共 18 个字节。如果未指定地址( sun_path[0] 为 0),这是等价于 IPv4 的 INADDR_ANY 或 IPv6 的 IN6ADDR_ANY_INIT

Unix 域套接字的 bind 调用
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <strings.h>


int main(int argc, char **argv)
{
        int sockfd;
        socklen_t len;
        struct sockaddr_un addr1, addr2;


        if (argc != 2) {
                perror("usage: unixbind <pathname>");
                exit(EXIT_FAILURE);
        }


        sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);


/*如果已经存在该路径名,则 bind 会失败;为了排除这种情况,先删除该路径名,以防它的事先存在。如果不存在
 * 那么 unlink 返回一个错误,该错误可以忽略
*/
        unlink(argv[1]);


        bzero(&addr1, sizeof(addr1));


        addr1.sun_family = AF_LOCAL;


        strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path)-1);


        bind(sockfd, (struct sockaddr *)&addr1, SUN_LEN(&addr1));


        len = sizeof(addr2);


        getsockname(sockfd, (struct sockaddr *)&addr2, &len);


        printf("bound name = %s, return len = %d\n", addr2.sun_path, len);


        exit(0);
}

运行输出:
./unixbind /tmp/unix.soktmp
bound name = /tmp/unix.soktmp, return len = 19
getsockname() 返回到第 3 个参数 len 中的是第 2 个参数 addr2 所指向缓冲区的长度:sun_path 占 2 个字节,/tmp/unix.soktmp 和 一个空字符共 17 个字节,总共 19 个字节。

使用 ls 命令查看指定的 /tmp/unix.soktmp 文件:
ls -lF /tmp/unix.soktmp
srwxr-xr-x 1 beyes users 0 Nov 27 14:44 /tmp/unix.soktmp=
ls 命令的 -F 选项表示表示归类的列出文件的类型。上面的 unix.soktmp 前面的 s 表示该文件是个 sockets 文件;后面的 '=' 符号也是表示这个意思,只是如果有多个 sockets 文件在同一个目录下时,这些文件的末尾都会标以一个 '=' 符号。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-27 22:19 , Processed in 0.060205 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表