реализация нескольких серверов и клиентов с UDP в python - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь создать простое приложение, которое передает файлы по протоколу UDP. Следует сохранять список файлов и отправлять каждый файл, когда кто-нибудь об этом попросит. Я реализовал два порта 1 - для связи и сообщения 2 - для передачи файлов. Наиболее важной частью является то, что приложение является сервером и клиентом одновременно, например, программа отправляет файл другому пользователю и получает файл одновременно. Когда я отправляю свои данные, я не могу получить в другом приложении, но когда я отслеживаю свой порт, я вижу, что данные отправляются:

21:58:13.195105 IP 127.0.0.1.47756 > 127.0.0.1.3001: UDP, length 49
0x0000:  4500 004d d923 4000 4011 637a 7f00 0001  E..M.#@.@.cz....
0x0010:  7f00 0001 ba8c 0bb9 0039 fe4c 7032 705f  .........9.Lp2p_
0x0020:  7365 7276 6572 2c73 6561 7263 685f 666f  server,search_fo
0x0030:  722c 612e 7478 742c 616c 692d 4c61 7469  r,a.txt,a-Lati
0x0040:  7475 6465 2d45 3734 3430 3837 35         tude-E7440875

, но клиент не может получить. И когда я запустил другой файл для получить Я получаю эту ошибку: BlockingIOError: [Errno 11] Ресурс временно недоступен

моя реализация клиента и сервера:

    import socket

def bind_socket_server(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    try:
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    except AttributeError:
        pass  # Some systems don't support SO_REUSEPORT
    sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20)
    sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
    sock.bind(('', port))
    sock.setblocking(0)
    # Set some more multicast options
    intf = socket.gethostbyname(socket.gethostname())
    sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf))
    return sock

def bind_socket_client():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20)
    return sock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...