Unix域套接字

Unix域套接字是一种在单主机上实现高效客户/服务器通信的IPC方法,提供字节流和数据报两种类型。它们比TCP套接字更快,允许在同一主机上传递描述符,并具有额外的安全性。本文将探讨其特点、地址结构、编程注意事项,以及如何利用socketpair、sendmsg/recvmsg等实现全双工通信和传递描述符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

UNIX域协议特点:

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

域套接字比流式套接字快的原因?

UNIX域套接字用于同一台pc上运行的进程之间通信,它仅仅复制数据,不执行协议处理,不需要增加删除网络报头,无需计算校验和,不产生顺序号,无需发送确认报文。

UNIX域套接字地址结构

struct sockaddr_un{
    sa_family sun_family;    //AF_LOCAL,地址族
    char   sun_path[104];    //必须以空字符结尾,通过这样一个路径描述地址
};

UNIX域字节流回射客户/服务

服务端

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define ERR_EXIT(m) \
	do \
	{ \
		perror(m); \
		exit(EXIT_FAILURE); \
	}while(0)

void echo_srv(int conn)
{
	char recvbuf[1024];
	int n;
	while(1)
	{
		memset(recvbuf,0,sizeof(recvbuf));
		//不断接收一行数据到recvbuf中
		n=read(conn,recvbuf,sizeof(recvbuf));
		if(n==-1)
		{
			if(n==EINTR)
				continue;
			ERR_EXIT("read");
		}
		//客户端关闭
		else if(n==0)
		{
			printf("client close\n");
			break;
		}
		fputs(recvbuf,stdout);
		write(conn,recvbuf,strlen(recvbuf));
	}
	close(conn);
}
int main(void)
{
	int listenfd;
	//创建一个监听套接字
	//它的协议家族是PF_UNIX,用流式套接字SOCK_STREAM
	if((listenfd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值