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域套接字较新的实现把客户的凭证提供给服务器,从而能提供额外的安全检查措施。
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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 C++ 程序,用于在 UNIX 上进行套接字通信: ```cpp #include <iostream> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> #include <cstring> const char* SOCKET_PATH = "/tmp/mysocket"; int main() { // 创建套接字 int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd == -1) { std::cerr << "Failed to create socket" << std::endl; return 1; } // 绑定到 socket 地址 struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1); if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { std::cerr << "Failed to bind socket" << std::endl; close(sockfd); return 1; } // 监听连接请求 if (listen(sockfd, 5) == -1) { std::cerr << "Failed to listen on socket" << std::endl; close(sockfd); return 1; } // 等待客户端连接 int clientfd = accept(sockfd, nullptr, nullptr); if (clientfd == -1) { std::cerr << "Failed to accept client" << std::endl; close(sockfd); return 1; } // 读取客户端发送的数据 char buf[256]; int numBytes = read(clientfd, buf, sizeof(buf)); if (numBytes == -1) { std::cerr << "Failed to read from client" << std::endl; close(clientfd); close(sockfd); return 1; } // 打印接收到的数据 std::cout << "Received " << numBytes << " bytes: " << buf << std::endl; // 关闭套接字 close(clientfd); close(sockfd); return 0; } ``` 在这个程序中,我们首先使用 `socket` 函数创建了一个 UNIX 套接字。然后,我们使用 `bind` 函数将套接字绑定到一个本地地址上,这里我们使用了 `/tmp/mysocket` 作为地址。接下来,我们使用 `listen` 函数开始监听连接请求。当有客户端连接时,使用 `accept` 函数接受连接请求,并返回一个新的套接字,可以使用这个套接字与客户端进行通信。在这个程序中,我们只是简单地从客户端读取数据,并将其打印到标准输出流中。最后,我们关闭套接字并退出程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值