- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在旧版本的 Mac OS X 中,通配符绑定(bind)的工作方式如下所述:
Multicast Addresses
The meaning of SO_REUSEADDR changes for multicast addresses as it allows multiple sockets to be bound to exactly the same combination of source multicast address and port. In other words, for multicast addresses SO_REUSEADDR behaves exactly as SO_REUSEPORT for unicast addresses. Actually the code treats SO_REUSEADDR and SO_REUSEPORT identically for multicast addresses, that means you could say that SO_REUSEADDR implies SO_REUSEPORT for all multicast addresses and the other way round.
和
MacOS X
At its very core, MacOS X is simply a BSD-style UNIX, based on a rather late fork of the BSD code, which was even synchronized with FreeBSD 5 for the Mac OS 10.3 release. That's why MacOS X offers the same options as BSD and they also behave the same way as in BSD.
但是在 10.10.5 中,我在测试网络库时发现了一个变化。
即使设置了 SO_REUSEADDR,两个未绑定(bind)(通配符)UDP 套接字也不能再共享同一端口 (errno=EADDRINUSE)。两者都必须设置 SO_REUSEPORT,这对我来说是个谜。
它可以用这个简单的测试代码重现:
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
int main() {
for(int p = 0; p < 4; ++p) {
printf("Flags set: ");
if(p&1) printf("SO_REUSEADDR ");
if(p&2) printf("SO_REUSEPORT");
printf("\n");
int handles[2];
bool success = true;
for(int i = 0; i < sizeof(handles)/sizeof(int); ++i) {
handles[i] = socket(AF_INET, SOCK_DGRAM, 0);
int flag = 1;
if((p&1) && setsockopt(handles[i], SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) == -1) {
printf("Setsockopt %d, SO_REUSEADDR failed with errno\n", i, errno);
success = false;
break;
}
if((p&2) && setsockopt(handles[i], SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag)) == -1) {
printf("Setsockopt %d, SO_REUSEPORT failed with errno\n", i, errno);
success = false;
break;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = 2000; // does not matter as long as it is currently free
addr.sin_addr.s_addr = 0; // wildcard address
if(bind(handles[i], (struct sockaddr*)&addr, sizeof(addr)) == -1) {
printf("Bind %d failed with errno %d\n", i, errno);
success = false;
break;
}
}
if(success)
printf("Alright\n");
for(int i = 0; i < sizeof(handles)/sizeof(int); ++i)
close(handles[i]);
printf("\n");
}
return 0;
}
哪些输出:
Flags set:
Bind 1 failed with errno 48
Flags set: SO_REUSEADDR
Bind 1 failed with errno 48
Flags set: SO_REUSEPORT
Alright
Flags set: SO_REUSEADDR SO_REUSEPORT
Alright
最佳答案
In older versions of Mac OS X, wildcard binding works like described here:
Multicast Addresses
…您引用的描述适用于多播地址。您的测试代码不使用 multicast address 。因此,适用不同的描述(来自同一来源):
SO_REUSEPORT
SO_REUSEPORT
is what most people would expectSO_REUSEADDR
to be. Basically,SO_REUSEPORT
allows you to bind an arbitrary number of sockets to exactly the same source address and port as long as all prior bound sockets also hadSO_REUSEPORT
set before they were bound. …您的测试代码完全证实了这一点。
关于macos - SO_REUSEADDR 和 SO_REUSEPORT 的行为改变了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32661091/
我一直在为 Linux 开发多线程套接字服务器,我正在尝试不同的方法来多路复用 I/O,看看哪种方法效果最好。 我已经有了创建共享 epoll/套接字的代码 - 启用了 EPOLLONESHOT -
我正在使用 boost 库开发多进程套接字服务器。 每个进程运行一个 io_service . 我希望这个进程都在同一个端口上接受。 我知道 SO_REUSEPORT (在 linux 内核 3.9
我正在学习 SO_REUSEPORT 套接字选项,当我阅读“https://lwn.net/Articles/542629/”时,我对这句话感到困惑:“这简化了在客户端和服务器之间进行有状态对话的任务
我想知道标志 SO_REUSEPORT 的整数值。 在搜索时我找到了 here SO_REUSEPORT 已由值 0x0200 定义,这意味着 512,而在其他地方它是 SO_REUSEPORT 15
例如 linux kernel-2.6.32-279 没有在/usr/include/asm-generic/socket.h 中定义 SO_REUSEPORT 但 kernel-2.6.32-431
我想知道在 LINUX 2.6 中是否启用了 SO_REUSEPORT 选项?? 如果我尝试使用它并编译我的代码,我会收到以下错误 01.c:72: error: `SO_REUSEPORT' und
运行模拟器时出现以下错误,调试也不起作用,它说正在等待调试器附加。我想知道以下是否与陷入“等待调试器附加”有关。 Emulator: E0516 21:01:34.057349753 3279 soc
在旧版本的 Mac OS X 中,通配符绑定(bind)的工作方式如下所述: Socket options SO_REUSEADDR and SO_REUSEPORT, how do they dif
简而言之,SO_REUSEPORT 套接字选项允许在 ip:port 对上创建多个套接字。例如,program1和program2都可以调用函数链socket()->bind()->listen()-
在关于 SO_REUSEPORT 的讨论中,以下问题已发布到 reddit ,却无人接听。我想知道 Stack Overflow 是否知道答案。 Can anyone tell me how this
我有一个基于 libuv 的 C 语言 UDP 服务器,我们有一个: Main Thread:接收一个 UDP 数据包,将其排入 4 个队列之一,并调用对 4 个 worker 之一的出队回调。主线程
我已经阅读了 std::net 和 mio 的文档,并且发现了一些方法,例如 set_nodelay 和 set_keepalive,但我还没有找到在给定套接字上设置其他套接字选项(如 SO_REUS
Linux 内核 >= 3.9 允许通过设置 SO_REUSEPORT 在具有内核负载平衡的进程之间共享套接字:http://lwn.net/Articles/542629/ 这如何用于 AF_UNI
我的 Linux 应用程序需要以大约每秒 600,000 个数据包的速度接收一个包含中等大小数据包 (~1 KB) 的 UDP 流。我当前的实现是幼稚的:它有一个简单地调用 recv() 的线程。重复
我发现多个答案建议在多个 UDP 客户端需要监听同一端口上的广播时使用 SO_REUSEPORT 套接字选项。但是,我收到此选项不可用的错误消息。使用 python 2.7 from socket i
我对不使用 Elixir/Erlang 热升级的零停机部署系统感兴趣(由于代码运行时数据迁移的复杂性)。 我听说我可以在将服务器绑定(bind)到适配器时使用 SO_REUSEPORT 选项,这样我就
我正在学习套接字编程 tutorial出现了以下代码 // Forcefully attaching socket to the port 8080 setsockopt(server_fd, SOL
我正在编写一个多进程 UDP 服务器,它使用 SO_REUSEPORT 让多个工作进程监听同一个端口。 有没有办法告诉内核我希望根据数据包的源地址将数据包一致地传送到进程? (服务器需要根据源地址保存
考虑这段代码: #include #include #include #include #include #include #include #include #define SERV
我试图在 Ubuntu 20.04 上安装没有 Android Studio 的 SDK 和 Emulator。 但是被这个错误卡住了。 E0520 11:06:29.866803544 526
我是一名优秀的程序员,十分优秀!