Unix域套接字

Unxi域套接字并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API就是在不同主机上执行客户/服务器通信所用的API。可以视为IPC方法之一。
UNix域提供两类套接字: 字节流套接字(类似TCP)数据报套接字(类似UDP)

使用Unix域套接字有以下三个理由:
    1、Unix域套接字往往比通信两端位于同一主机的TCP套接字快出一倍。X Window System发挥了Unix域套接字的这个优势。当一个X11客户打开到一个X11服务器的连接时,该客户检查DISPLAY环境变量的值(其中指定服务器的主机名,窗口和屏幕)。如果服务器和客户处于同一主机,客户就打开一个到服务器的Unix域套接字字节流连接,否则打开一个到服务器的TCP连接。
    2、 Unix域套接字可用于在同一主机上的不同进程之间传递描述符
    3、unix域套接字较新的实现把客户的凭证提供给服务器,从而能提供额外的安全检查措施。
Unix域中用于标识客户和服务器的协议地址是普通文件系统中的路径名。

Unix域套接字地址结构
struct sockaddr_un{
    sa_family sun_family;    //AF_LOCAL
    char     sun_path[104];    //必须以空字符结尾
};



下面给出一个例子,Unix域的套接字的bind调用
#include "unp.h"

int main(int ac, char *av[])
{
    int sockfd;
    socklen_t len;
    struct sockaddr_un addr1, addr2;

    if(ac != 2)
    {
        fprintf(stderr,"Usage : xxx <pathname>");
        exit(1);
    }

    if((sockfd=socket(AF_LOCAL,SOCK_STREAM,0)) < 0)
        oops("socket error");
    
    unlink(av[2]);                //如果系统中已经存在了该路径名,bind将会调用失败,返回Already in use错误,为此我们先删除它。如果文件不存在,我们也不去管unlink 返回的错误

    bzero(&addr1, sizeof(addr1));
    addr1.sun_family = AF_LOCAL;
    strncpy(addr1.sun_path, av[1], sizeof(addr1.sun_path)-1);
    if(bind(sockfd, (struct sockaddr *)&addr1, SUN_LEN(&addr1)) < 0)
        oops("bind error");
    
    len = sizeof(addr2);
    if(getsockname(sockfd, (struct sockaddr *)&addr2, &len) < 0)
        oops("getsockname error");
    
    printf("bound name = %s, returned len =    %d\n",addr2.sun_path, len);
    return 0;
}



以下为结果
./USB /tmp/moose
bound name = /tmp/moose, returned len =13


如果我们没有使用unlink,那么在文件已存在条件下重复上述指令:
./USB /tmp/moose
bind error: Address already in use


使用Unix域套接字的
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值