- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 POSIX 文档中,我看不到任何阻止将 SO_REUSEADDR
套接字选项与 AF_UNIX
一起用于 UNIX 域套接字的情况。
但是,如果套接字节点已经存在,它总是会在绑定(bind)时失败,并且似乎被忽略,并且似乎需要在调用之前首先取消链接文件系统上的套接字节点绑定(bind)
;简而言之,它不会重用该地址。网络上有很多关于此问题的帖子,但没有一个提供解决方案。
我不会坚持,如果它不起作用,它就不起作用(至少在 BSD 和 Linux 系统上似乎是一样的),只是有一个问题:这是正常行为还是不正常?是否有任何指示表明应该支持它,或者相反,是否有任何指示表明不应支持它?或者这是未指定的?请注意,该问题是在 POSIX 上下文中提出的,而不是在任何特定平台上下文中提出的。
我欢迎任何关于此事的 POSIX 引用。
取消链接
谁知道什么我在网络上看到了一些帖子,建议在绑定(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 … */
最佳答案
我只能访问一份 POSIX 规范文档,即 System Interfaces ,所以我将从这里尽力而为。
我们的规范洞穴探险当然必须从 2.10.6 Use of Options 开始。 ,它定义了 SO_REUSEADDR
选项如下:
The SO_REUSEADDR option indicates that the rules used in validating addresses supplied in a bind() should allow reuse of local addresses. Operation of this option is protocol-specific. The default value for SO_REUSEADDR is off; that is, reuse of local addresses is not permitted.
本段基本上通过将其委托(delegate)给底层协议(protocol)的规范来否认此选项真正用途的任何规范。
Section 2.10.17 Use of Sockets for Local UNIX Connections描述了创建 UNIX 域套接字的机制,但实际上它唯一告诉我们的是要使用什么套接字类型常量以及要使用哪个结构体作为地址。 The documentation for the sockaddr_un
struct只告诉我们它的格式,而不告诉我们它在 bind
上的行为.
The documentation for bind
itself可以理解的是,它与协议(protocol)无关,只告诉我们本地址已被使用时会发生什么,而不是在什么情况下重新绑定(bind)同一套接字是有效的。
虽然它不是 POSIX 标准文档,但富士通有 a document on the POSIX sockets API这很有趣,因为它不是专门针对 Linux 或 BSD 的。本文档第 2.6.4 节对 bind
的行为进行了以下说明在 UNIX 套接字上:
The path name, which must be specified in the
sun.sun_path
component, is created as a file in the file system usingbind()
. The process that callsbind()
must therefore have write rights to the directory in which the file is to be written. The system does not delete the file. It should therefore be deleted by the process when it is no longer required.
虽然这没有说明 SO_REUSEADDR
特别是,它确实指出 bind
的行为是创建一个文件,并且绑定(bind)进程有责任在不再使用它时将其删除。
最后,本文档对setsockopt
的描述关于 SO_REUSEADDR
有以下说法:
Specifies that the rules for the validity check on the addresses specified for bind() should permit the reuse of local addresses provided this is supported by the protocol.
虽然这没有具体提及 AF_UNIX
,它确实承认此选项并不适用于所有协议(protocol)。
我还发现了a (non-authoritative) summary describing the intended purpose of SO_REUSEADDR
:
This socket option tells the kernel that even if this port is busy (in the
TIME_WAIT
state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error.
TIME_WAIT
状态主要针对面向互联网的套接字而存在,以避免新程序绑定(bind)到最近被另一个程序使用的端口并无意中接收与旧程序相关的数据包。这个问题可以说不适用于 UNIX 域套接字,因为两个程序不太可能尝试在同一路径创建套接字,因此如果 TIME_WAIT
未针对 UNIX 套接字实现,那么这可能是原因的一个(近似)解释 SO_REUSEADDR
不适用于AF_UNIX
.
关于sockets - SO_REUSEADDR 和 AF_UNIX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15716302/
我遇到过设置了 SO_REUSEADDR 选项的 UDP 套接字的有趣行为... 如果我通过 IP/UDP 发送 1472 字节,我会在一帧中得到所有数据——这是预期的...... 但是 1473 碎
是否存在最大套接字数可以限制 REUSEADDR 套接字操作。我达到了文件描述符的最大数量,但我可以对所有套接字使用相同的地址和端口,重用地址操作的数量是否有限制???如果有,我怎样才能得到号码 最佳
我已经使用 SO_REUSEADDR 让我的服务器被终止重新启动,而不会提示套接字已在使用中。我在想:SO_REUSEADDR 还有其他用途吗?除了上述目的之外,是否有人使用套接字选项? 最佳答案 对
这个问题在这里已经有了答案: What are the use cases of SO_REUSEADDR? (2 个答案) 关闭 4 年前。 我正在尝试理解多播代码,但我不理解一小部分的实用程序:
我在一个 Java 客户端库中看到了这句话: socket.setReuseAddress(true); 以为这是用来提高性能的,因为 SO_REUSEADDR 选项可以指示套接字可以强制使用 TIM
我有几个基本问题: 1.一个socket由一个协议(protocol)、一个本地ip、本地端口、远程ip和远程端口来表示。假设客户端和服务器之间存在这样的连接。现在当我将另一个客户端绑定(bind
事实 在 POSIX 文档中,我看不到任何阻止将 SO_REUSEADDR 套接字选项与 AF_UNIX 一起用于 UNIX 域套接字的情况。 但是,如果套接字节点已经存在,它总是会在绑定(bind)
我一直在尝试学习使用 c 进行套接字编程,但遇到了一些让我感到困惑的事情。我写了这段代码: int main(int argc, char *argv[]) { int sockfd =
我在 SO_REUSEADDR 上看到的所有讨论都假定它是同一个程序在已知端口上创建和绑定(bind)到 TCP 套接字。 我有两个不同的程序使用同一个端口,我很好奇这个机制是如何工作的——为了让程序
在 unix 网络编程中,我总是在服务器使用的套接字上设置 SO_REUSEADDR 选项来监听连接。这基本上表示可以在机器上的同一端口上打开另一个套接字。这在从崩溃中恢复并且套接字未正确关闭时非常有
我在树莓派上运行自己的 http 服务器。问题是当我停止程序并重新启动它时,该端口不再可用。有时我在收到大量请求时会遇到同样的问题。 我想使用 SO_REUSEADDR 这样即使发生错误我也可以继续使
请帮忙, 起初,我创建了一个套接字并将其绑定(bind)到没有 SO_REUSEADDR 的地址。 然后,我的程序崩溃了(没有正确关闭套接字) 接下来,我再次运行它并从 bind() 返回“Addre
(在 VS2017、Win7 x64 上运行) 我对 SO_REUSEADDR 的观点感到困惑和 SO_EXCLUSIVEADDRUSE .是的,我读过 MSDN documentation ,但我显
在旧版本的 Mac OS X 中,通配符绑定(bind)的工作方式如下所述: Socket options SO_REUSEADDR and SO_REUSEPORT, how do they dif
我有一个应用程序,其中单个客户端与单个服务器通信。通常情况下,客户端只做一次connect,然后重复调用send,就没有问题。 但是,我需要做一个客户端为每个单独的 send 建立连接的版本(有点像带
据我所知,SO_REUSEADDR 允许服务器绑定(bind)到一个处于 TIME_WAIT 状态的地址。但是它如何影响服务器在接受新连接时的 Action 呢? 假设我们正在主机 A 和服务器 B
我遇到了一个奇怪的行为。 manual claimed :“当两个套接字绑定(bind)到相同的端口号但在不同的显式接口(interface)上时,没有冲突”。 为什么在第 3 步出现以下情况时系统会
我正在使用 SO_REUSEADDR 选项,但我不确定为什么会得到 资源临时不可用选项。 我正在 127.0.0.1 上测试客户端服务器代码 if ( (sockfd = socket(AF_INET
我正在构建一个应用程序,该应用程序使用 multiprocessing 包的 Listener/Client 类与另一个脚本进行通信。 我可以成功创建监听器和客户端并进行通信,但是我仍然收到 TCP
我正在运行两个 SCTP RPM 包。lksctp-工具-1.0.11lksctp-tools-devel-1.0.11 我的 sctp 头文件位于/usr/include/netinet/sctp.
我是一名优秀的程序员,十分优秀!