gpt4 book ai didi

sockets - SO_EXCLUSIVEADDRUSE 和 SO_REUSEADDR 混淆

转载 作者:行者123 更新时间:2023-12-03 12:03:30 25 4
gpt4 key购买 nike

(在 VS2017、Win7 x64 上运行)

我对 SO_REUSEADDR 的观点感到困惑和 SO_EXCLUSIVEADDRUSE .是的,我读过 MSDN documentation ,但我显然没有得到它。

我在两个单独的进程中有以下简单代码。正如所料,因为我启用了 SO_REUSEADDR在两个套接字上,第二个进程的绑定(bind)成功。 如果我不在这些套接字中的任何一个上启用此功能,第二次绑定(bind)将不会成功 .

#define PORT 5150
SOCKET sockListen;
if ((sockListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("WSASocket() failed with error %d\n", WSAGetLastError());
return 1;
}

int optval = 1;
if (setsockopt(sockListen, SOL_SOCKET, `SO_REUSEADDR`, (char*)&optval, sizeof(optval)) == -1)
return -1;

SOCKADDR_IN InternetAddr;
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = inet_addr("10.15.20.97");
InternetAddr.sin_port = htons(PORT);

if (::bind(sockListen, (PSOCKADDR)&InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
{
printf("bind() failed with error %d\n", WSAGetLastError());
return 1;
}

所以不必启用 SO_REUSEADDR为两个 socket 制作 SO_EXCLUSIVEADDRUSE不必要 - 如果我不想让任何人强行绑定(bind)到我的端口,我只是不启用 SO_REUSEADDR在那个过程中?

我能看到的唯一区别是,如果我启用 SO_EXCLUSIVEADDRUSE在第一个进程中,然后在第二个进程中尝试绑定(bind),第二个绑定(bind)将失败

一) WSAEADDRINUSE如果我 不要启用 SO_REUSEADDR在第二个过程中

b) WSAEACCES如果我 启用 SO_REUSEADDR在第二个过程中

所以我尝试同时启用 SO_EXCLUSIVEADDRUSESO_REUSEADDR在第一个过程中,但发现我尝试第二个过程中的任何一个都失败了 WSAEINVAL .

另请注意,我已阅读 this过去的问题,但那不是我所看到的:它说

A socket with SO_REUSEADDR can always bind to exactly the same source address and port as an already bound socket, even if the other socket did not have this option set when it was bound



现在,如果是这样的话,那么我绝对可以看到对 SO_EXCLUSIVEADDRUSE 的需求。 .

我很确定我做错了什么,但我看不到;有人可以澄清一下吗?

最佳答案

如文档中所述,SO_EXCLUSIVEADDRUSE 在 Windows NT4 SP4 上可用;在那之前有仅限 SO_REUSEADDR。所以两者的存在都有(也)历史原因。

我认为 SO_REUSEADDR 是为了共享一个地址(这仅对 UDP 多播真正有用。对于单播或 TCP,它实际上并没有多大作用,因为这两个套接字的行为都是不确定的)。

SO_EXCLUSIVEADDRUSE 是一种安全措施,可避免我的(服务器)应用程序的流量被后来绑定(bind)到相同的 IP/端口而被劫持/变得无用。

正如我所看到的,您需要 SO_REUSEADDR 用于 UDP multicats,并且您需要 SO_EXCLUSIVEADDRUSE 作为服务器应用程序的安全措施。

关于sockets - SO_EXCLUSIVEADDRUSE 和 SO_REUSEADDR 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49673200/

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