事实
在POSIX文件,我看不到任何东西防止使用的SO_REUSEADDR
与socket选项AF_UNIX
用于UNIX域套接字。
然而,它总是失败在bind
的时间,如果插座节点已经存在,而且似乎被忽略,似乎就需要断开链接的文件系统调用之前首先对插座节点bind
; 总之,它不会重用地址。 有大量的线程这个问题在网络上,没有一个解决方案。
问题
我不会强求,如果它不工作,这是行不通的(似乎是相同的至少两个BSD和Linux系统),只是有一个问题:这是正常的行为,或不? 是否有建议它应该支持任何指针,或相反,任何指针表明它不应该? 或者,这是不确定? 需要注意的问题是问在POSIX背景下,而不是在任何特定的平台环境。
我欢迎对此事的任何POSIX参考。
附加说明:一个微小的片段不盲目unlink
谁,知道是什么
我已经看到了网络上一些线程,建议以unlink
到事先预期的名称的任何节点bind
。 我觉得这是不安全的,和一个只应取消关联节点这已经是在这种情况下,插座节点:恩。 它可能是错的,断开链接的文本文件名为mysocket
重新创建同名到位插座节点。 本着这一宗旨,这里是一个很小的片段:
/* Create the socket node
* ----------------------
* Note `SO_REUSEADDR` does not work with `AF_UNIX` sockets,
* so we will have to unlink the socket node if it already exists,
* before we bind. For safety, we won't unlink an already existing node
* which is not a socket node.
*/
status = stat (path, &st);
if (status == 0) {
/* A file already exists. Check if this file is a socket node.
* * If yes: unlink it.
* * If no: treat it as an error condition.
*/
if ((st.st_mode & S_IFMT) == S_IFSOCK) {
status = unlink (path);
if (status != 0) {
perror ("Error unlinking the socket node");
exit (1);
}
}
else {
/* We won't unlink to create a socket in place of who-know-what.
* Note: don't use `perror` here, as `status == 0` (this is an
* error we've defined, not an error returned by a system-call).
*/
fprintf (stderr, "The path already exists and is not a socket node.\n");
exit (1);
}
}
else {
if (errno == ENOENT) {
/* No file of the same path: do nothing. */
}
else {
perror ("Error stating the socket node path");
exit (1);
}
}
/* … invoke `bind` here, which will create the socket node … */