微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用bind时适当的AF_UNIX套接字的长度

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) – 或者什么是正确的方式?

套接字和文件描述符重用(或缺less)

Winsock:C ++中的Windowsnetworking编程

如何在Unix套接字编程中获得本地IP地址和端口?

c ++ select()递减文件描述符计数

如何最有效地处理大量的文件描述符?

如何使用套接字c / C ++在块中发送文件

Socket编程C / C ++ – recv函数在服务器中挂起

epoll的EPOLLEXCLUSIVE模式如何与电平触发进行交互?

对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

Linux套接字的时间戳

sizeof(struct sockaddr_un)很好。

看一下unix(7)的manpage unix(7) 。 字段sun_path是一个字符数组,是结构的一部分。

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

#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 )可能是更安全的,但是告诉内核精确的长度也不会伤害。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐