我在订阅多播地址的同一端口上侦听了多个进程。此地址的数据包到达每个进程。但是,当我通过单播联系他们时,只有最新的进程才会收到消息。这种行为记录在哪里?我怎样才能改变它?
演示程序(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()
答案 0 :(得分:2)
MSDN声明多个套接字正在侦听单播消息的同一端口的行为未定义,并且无法知道哪个接收器将接收数据。我使用C ++和winsock2.2测试了类似的设置,并且具有与在python下运行程序时相似的结果(即进程阻塞效果)。