网络编程学习笔记(Unix域套接口地址)

Unix域协议并不是一个实际的协议族,它只是在现一台主机上进行客户-服务通信时,使用与在不同主机上的客户和服务器间通信时相同的API的一种方法 ,当客户和服务器在同一台主机上时,Unix域协议 是IPC通信方式的一个替代品

使用Unix域套接口有三个原因:

1、当通信双方在同一台主机上时,Unix域套接口的速度通常是TCP套接口的两倍

2、Unix域套接口可以用来在同一台主机上的各进程之间传递描述字

3、Unix域套接口的较新实现中可以向服务器提供客户的凭证,这能提供附加的安全检查


Unix域套接口地址结构定义在<sys/un.h>头文件中,其结构定义如下:

struct sockaddr_un
{
    uint8_t sun_len;
    sa_family_t sun_family;//AF_LOCAL
    char sun_path[104]; //null-terminated pathname
};

套接口的捆绑如下:

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	int sockfd;
	socklen_t len;
	struct sockaddr_un addr1, addr2;
	
	if (argc != 2) {
		printf("usage: unixbind <pathname>\n");
		return -1;
	}

	sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);	
	unlink(argv[1]);
	bzero(&addr1, sizeof(addr1));
	addr1.sun_family = AF_LOCAL;
	strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path) - 1);
	if (bind(sockfd, (struct sockaddr*)&addr1, SUN_LEN(&addr1)) < 0) {
		printf("bind error:%s\n", strerror(errno));
		return -1;
	}	

	len = sizeof(addr2);
	if (getsockname(sockfd, (struct sockaddr*)&addr2, &len) < 0) {
		printf("getsockname error:%s\n", strerror(errno));
		close(sockfd);
		return -1;
	}

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值