gpt4 book ai didi

sockets - boost asio SO_REUSEPORT

转载 作者:行者123 更新时间:2023-12-03 11:49:29 27 4
gpt4 key购买 nike

我正在使用 boost 库开发多进程套接字服务器。

每个进程运行一个 io_service .

我希望这个进程都在同一个端口上接受。

我知道 SO_REUSEPORT (在 linux 内核 3.9 之后)会有所帮助。

像这个python脚本

import socket                                                                                                                                                       

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

s.bind(('0.0.0.0', 9091))
s.listen(1)

while True:
conn, addr = s.accept()
print "new connection"
while True:
data = conn.recv(100)
print "got data", data
if not data or data == 'exit':
break
conn.close()

但我不知道如何在 boost asio io_service 中使用这个选项?

最佳答案

对于在 2019 年阅读本文的人:Asio 现在在 boost/asio/detail/impl/socket_ops.ipp 中包含一个解决方法:

#if defined(__MACH__) && defined(__APPLE__) \
|| defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
// To implement portable behaviour for SO_REUSEADDR with UDP sockets we
// need to also set SO_REUSEPORT on BSD-based platforms.
if ((state & datagram_oriented)
&& level == SOL_SOCKET && optname == SO_REUSEADDR)
{
call_setsockopt(&msghdr::msg_namelen, s,
SOL_SOCKET, SO_REUSEPORT, optval, optlen);
}
#endif

所以, socket_->set_option(udp::socket::reuse_address(true));将设置 SO_REUSEPORT如果需要,自动选择。

关于sockets - boost asio SO_REUSEPORT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596638/

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