Python зависает при получении сокетов, а Wireshark показывает все полученные - PullRequest
0 голосов
/ 18 октября 2018

У меня проблемы с написанием программы приемника сокета udp.

Я не контролирую источник передачи (только когда запускаю его) - используя udp_source.start_transmission().

Я также использую Wireshark для мониторинга сетевого трафика.

Согласно Wireshark - я передаю все данные.Например: источник отправляет 60000000 байт в пакетах udp.

Однако в Python программа зависает на tmp = sock.recvfrom(1500) после примерно 3/4 данных.Например: он не не достигает условия остановки цикла while.

    sock = socket.socket(family=socket.AF_INET, 
                  type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 512 * 1024)
    sock.connect((ip, port)) 

    udp_source.start_transmission()

    cntr = 0
    l = []
    total_size = 60000000
    rec_bytes_len = 0

    while rec_bytes_len < total_size:
        r, w, e = select.select([sock], [], [sock], 60)
        if r:
            tmp = sock.recvfrom(1500)
            rec_bytes_len += len(tmp)
        cntr += 1
        if cntr % 1000 == 0:
            print(cntr)  

Я пробовал:

  1. Увеличение буфера получателя: sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024 * 512 * 1024) - то же поведение
  2. Добавление массового тайм-аута sock.settimeout(60) - такое же поведение
  3. Создание разблокировки сокета - получена неблокирующая операция сокета не может бытьзавершено немедленно исключение

Кто-нибудь может помочь?

Спасибо.

РЕДАКТИРОВАТЬ

удалось заставить его работать.Оказывается, я недостаточно увеличил буфер.Как только я сделал буфер очень большим (1 ГБ), я получил все данные.Не уверен, почему это происходит, но там это ...

...