unix - AF_UNIX 本地数据报套接字的自动命名?

标签 unix sockets bind local datagram

我正在通过 unix 本地套接字(AF_UNIX 地址系列,即 而不是 UDP )使用数据报实现一个简单的服务。服务器绑定(bind)到一个公共(public)地址,它接收请求就好了。不幸的是,在回复时,sendto除非客户端也被绑定(bind),否则失败。 (常见错误是 Transport endpoint is not connected )。

绑定(bind)到一些随机名称(基于文件系统或抽象)有效。但我想避免这种情况:我是谁来保证我选择的名字不会发生冲突?

unix 套接字的流模式文档告诉我们将在 connect 处为它们分配一个抽象名称。如果他们还没有的话。这样的功能可用于面向数据报的套接字吗?

最佳答案

unix(7)我引用的手册页包含有关自动绑定(bind) UNIX 套接字的以下信息:

If a bind(2) call specifies addrlen as sizeof(sa_family_t), or the SO_PASSCRED socket option was specified for a socket that was not explicitly bound to an address, then the socket is autobound to an abstract address.



这就是 Linux 内核检查地址长度是否等于 sizeof(short) 的原因,因为 sa_family_t 是一个short。 Rob 的出色答案引用的另一个 unix(7) 手册页说客户端套接字总是在连接时自动绑定(bind),但是因为 SOCK_DGRAM 套接字是无连接的(尽管在它们上调用了连接),我相信这仅适用于 SOCK_STREAM 套接字。

另请注意,当提供您自己的抽象命名空间套接字名称时,此命名空间中的套接字地址由 sun_path 中的附加字节给出,这些字节由地址结构的指定长度覆盖。
struct sockaddr_un me;
const char name[] = "\0myabstractsocket";
me.sun_family = AF_UNIX;
// size-1 because abstract socket names are not null terminated
memcpy(me.sun_path, name, sizeof(name) - 1);
int result = bind(fd, (void*)&me, sizeof(me.sun_family) + sizeof(name) - 1);

sendto() 同样应该限制地址长度,而不是通过 sizeof(sockaddr_un)。

关于unix - AF_UNIX 本地数据报套接字的自动命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/94594/

相关文章:

java - 使用 Java Runtime 压缩并存档文件夹中的文件

java - 对于只有多个客户端的服务器,我应该使用套接字还是 nio?

java - Android 上的 InetAddress.getByName

sockets - sklearn.datasets fetch_olivetti_faces IOError : [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:661)

c++ - 从 QT C++ 返回自定义对象并在 QML 中打印属性

jquery - 解除绑定(bind) jQuery 插件?

jquery - 如何在新添加的 DOM 上创建实时点击事件

linux - 如何遍历文件并用行号回显每一行

linux - 为什么 awk 没有按预期工作

c - 最后一个struct dirent中字段d_off的含义