TCP本地套接字


差一点

我们就擦肩而过了

有趣

有用

有态度


本地套接字实际上也是进程间通信的一种手段,类似于管道、消息队列、共享内存等等,因为本地套接字使用方便,接受度高,现在已经普遍使用了。比如现在最火的kubernetes和docker,他们都在大量使用本地套接字。

本地套接字概述

本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地 址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实现的复杂度,效率比 TCP/UDP 套接字都要高许多。

本地流套接字

listenfd = socket(AF_LOCAL, SOCK_STREAM, 0);

这里面就是创建了一个本地流套接字,注意创建的套接字类型是 AF_LOCAL,并且使用字节流格式。

struct sockaddr_un servaddr;servaddr.sun_family = AF_LOCAL;strcpy(servaddr.sun_path, local_path)

创建了一个本地地址,这里的本地地址和 IPv4、IPv6 地址可以对应,数据类型为sockaddr_un,这个数据类型中的 sun_family 需要填写为 AF_LOCAL,最为关键的是需要对 sun_path 设置一个本地文件路径。

关于本地文件路径,需要明确一点,它必须是“绝对路径”,这样的话,编写好的程序可以在任何目录里被启动和管理。如果是“相对路径”,为了保持同样的目的,这个程序的启动路径就必须固定,这样一来,对程序的管理反而是一个很大的负担。

还有就是,在 Linux 下,任何文件操作都有权限的概念,应用程序启动时也有应用属主。如果当前启动程序的用户权限不能创建文件,那么本地套接字将不能创建,也需要权限才能对sock文件进行读写。

本地数据报套接字

socket_fd = socket(AF_LOCAL, SOCK_DGRAM, 0)

这里创建的套接字类型,注意是 AF_LOCAL,协议类型为SOCK_DGRAM,

struct sockaddr_un client_addr;client_addr.sun_family = AF_LOCAL;strcpy(client_addr.sun_path, tmpnam(NULL));

用本地文件替换了 IP地址和端口

if (bind(sockfd, (struct sockaddr *) &client_addr,sizeof(client_addr)) < 0) {	error(1, errno, "bind failed");}

将本地套接字 bind 到本地一个路径上,然而 UDP 客户端程序是不需要这么做的。本地数据报套接字这么做的原因是,它需要指定一个本地路径,以便在服务器端回包时,可以正确地找到地址;而在 UDP 客户端程序里,数据是可以通过 UDP 包的本地地址和端口来匹配的。


END



怎样学好网络编程?

分享一款Linux平台下的tcp协议栈!超级透彻!

socket套接字地址介绍



扫码二维码

获取更多精彩

just enjoy!



喜欢本文点个在看