gpt4 book ai didi

sockets - socket.SO_REUSEADDR : packets received by every vs by newest listener

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

我在同一个端口上监听的多个进程订阅了多播地址。到达此地址的数据包到达每个进程。但是,当我通过单播联系他们时,只有最新的过程会收到该消息。该行为记录在哪里?我该如何更改?

演示程序(Python):

import socket,os,struct,sys

def server():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 4242))

mreq = '\xef\x01\x02\x03' + struct.pack('=I', socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
d = sock.recvfrom(1024)
print('[s' + str(os.getpid()) + '] ' + repr(d))

def client():
caddr = '239.1.2.3'
caddr = '127.0.0.1' # Uncomment this and all servers print
csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
csock.sendto('data from ' + str(os.getpid()), 0, (caddr, 4242))

def main():
if sys.argv[1] == 's':
server()
else:
client()

if __name__ == '__main__':
main()

最佳答案

MSDN指出,多个套接字正在监听同一端口的单播消息的行为是不确定的,并且无法得知哪个套接字将接收数据。我使用C++和winsock2.2测试了类似的设置,并且与在python下运行程序时得到了类似的结果(即进程阻塞效果)。

Here's the MSDN article

关于sockets - socket.SO_REUSEADDR : packets received by every vs by newest listener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/747272/

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