socket.SO_REUSEADDR: пакеты, полученные каждым против нового слушателя - PullRequest
2 голосов
/ 14 апреля 2009

Я получил несколько процессов, прослушивающих один и тот же порт, подписанный на адрес многоадресной рассылки. Пакеты по этому адресу достигают каждого процесса. Однако, когда я связываюсь с ними через одноадресную рассылку, только самый новый процесс получает сообщение. Где это поведение задокументировано? Как я могу это изменить?

Демонстрационная программа (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()

1 Ответ

2 голосов
/ 14 апреля 2009

В MSDN указано, что поведение, когда несколько сокетов прослушивают один и тот же порт для одноадресных сообщений, не определено и что нет способа узнать, какой из них получит данные. Я протестировал аналогичную настройку с использованием C ++ и winsock2.2 и получил те же результаты, что и при запуске вашей программы под python (а именно, эффект блокировки процесса).

Вот статья MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...