os.dup2() 在 python 中的伪 TCP 多播?

psuedo TCP multicast with os.dup2() in python?

这个想法是多播 同一内容从一个单一资源一次到多个接收者。我想出了以下代码:

#!/usr/bin/env python
# coding: utf8

import socket, os

c = socket.socket()
c.connect(('127.1', 4343))

s = socket.socket()
s.bind(('127.1', 8989))
s.listen(3)
while 1:
  conn, addr = s.accept()
  print 'Connected by %s:%s' % addr
  os.dup2(conn.fileno(), c.fileno(), )
s.close()

我用 netcat 测试了它但没有成功,要么 client 意外退出,要么 server 在任何连接后退出。这可能吗?我做错了什么?

os.dup2() 调用后,两个文件描述符 (FD) 都引用同一个套接字,因此共享其缓冲区。当使用原始 FD 提取数据(通过 recv()read())时,将无法再使用复制的 FD 提取该片段,反之亦然。输入数据的每个八位字节将被单个接收器读取一次,不会为每个 FD 重复读取(我想这就是你弄错的地方)。

有关可靠的多播解决方案,请参阅 this answer 和链接的主题。