gpt4 book ai didi

python - SO_REUSEPORT 可以用在 Unix 域套接字上吗?

转载 作者:IT王子 更新时间:2023-10-29 00:26:38 24 4
gpt4 key购买 nike

Linux 内核 >= 3.9 允许通过设置 SO_REUSEPORT 在具有内核负载平衡的进程之间共享套接字:http://lwn.net/Articles/542629/

这如何用于 AF_UNIX 类型的套接字?

看来,它只适用于 TCP,不适用于 Unix 域套接字。

这是一个Python测试程序:

import os
import socket

if not hasattr(socket, 'SO_REUSEPORT'):
socket.SO_REUSEPORT = 15

if True:
# using TCP sockets
# works. test with: "echo data | nc localhost 8888"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind(('', 8888))
else:
# using Unix domain sockets
# does NOT work. test with: "echo data | nc -U /tmp/socket1"
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
try:
os.unlink("/tmp/socket1")
except:
pass
s.bind("/tmp/socket1")

s.listen(1)
while True:
conn, addr = s.accept()
print('Connected to {}'.format(os.getpid()))
data = conn.recv(1024)
conn.send(data)
conn.close()

启动2个实例,多次运行如下测试:

  • 回显数据 | nc localhost 8888 用于 TCP
  • 回显数据 | nc -U/tmp/socket1 用于 Unix 域套接字

使用 TCP 时,传入的客户端将平衡到两个服务器。使用 Unix 域套接字,传入的客户端都连接到最后启动的服务器。

最佳答案

此特定内核补丁记录在此处:

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c617f398edd4db2b8567a28e899a88f8f574798d

从补丁文件列表中可以看出,补丁只影响了net/ipv4net/ipv6 套接字。 Unix 域套接字在 net/unix 中实现。所以,答案是:不,SO_REUSEPORT 不适用于 AF_UNIX 类型的套接字。

关于python - SO_REUSEPORT 可以用在 Unix 域套接字上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742368/

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