gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:42:43 25 4
gpt4 key购买 nike

我正在通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com