gpt4 book ai didi

c - 调用 bind() 时 AF_UNIX 套接字的正确长度

转载 作者:太空狗 更新时间:2023-10-29 16:53:38 24 4
gpt4 key购买 nike

bind () 需要你给它的 sockaddr 结构的长度。现在,对于 unix 套接字,sockaddr_un被使用

当您填写了 sun_path 成员时,计算长度的正确方法是什么?我见过多种方法:

socklen_t len = sizeof(sockaddr_un);
socklen_t len = offsetof(sockaddr_un,sun_path) + strlen(addr.sun_path);
socklen_t len = offsetof(sockaddr_un,sun_path) + strlen(addr.sun_path) + 1;
socklen_t len = sizeof(sockaddr.sun_family ) + strlen(addr.sun_path);

甚至其他方法。只采用 sizeof(sockaddr_un) 是否可以 - 或者什么是正确的方法?

最佳答案

您应该使用 SUN_LEN 宏。这是来自 /usr/include/sys/un.h 在我的 Mac 上:

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
/* actual length of an initialized sockaddr_un */
#define SUN_LEN(su) \
(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */

编辑:

是的,它不可移植,也不是 POSIX,但我们在真实平台上工作,不是吗?

问题是您必须以零终止路径,上面的代码与 sizeof( struct sockaddr_un ) 一样好,但在从用户复制到内核时可能会节省一些字节,但会浪费strlen 中的几个循环。

看看 Linux 如何处理这个长度(来自 http://lxr.linux.no/linux+v2.6.32/net/unix/af_unix.c#L200 ):

static int unix_mkname(struct sockaddr_un *sunaddr, int len, unsigned *hashp)
{
if (len <= sizeof(short) || len > sizeof(*sunaddr))
return -EINVAL;
if (!sunaddr || sunaddr->sun_family != AF_UNIX)
return -EINVAL;
if (sunaddr->sun_path[0]) {
/*
* This may look like an off by one error but it is a bit more
* subtle. 108 is the longest valid AF_UNIX path for a binding.
* sun_path[108] doesnt as such exist. However in kernel space
* we are guaranteed that it is a valid memory location in our
* kernel address buffer.
*/
((char *)sunaddr)[len] = 0;
len = strlen(sunaddr->sun_path)+1+sizeof(short);
return len;
}

*hashp = unix_hash_fold(csum_partial(sunaddr, len, 0));
return len;
}

这里的 len 是直接从第三个参数到 bind 系统调用,但是 sunaddr 已经被复制到内核空间中了那个长度。您的地址不能超过 sizeof( sockadd_un )。无论如何,内核都会执行 strlen

所以是的,执行 sizeof( sockaddr_un ) 可能更安全,但告诉内核确切长度也没有坏处。

关于c - 调用 bind() 时 AF_UNIX 套接字的正确长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2307511/

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