网络编程学习笔记(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;
}


你可能感兴趣的:(网络编程学习笔记(Unix域套接口地址))