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 和链接的主题。
这个想法是多播 同一内容从一个单一资源一次到多个接收者。我想出了以下代码:
#!/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 和链接的主题。