У меня проблемы с написанием программы приемника сокета 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)
Я пробовал:
- Увеличение буфера получателя:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024 * 512 * 1024)
- то же поведение - Добавление массового тайм-аута
sock.settimeout(60)
- такое же поведение - Создание разблокировки сокета - получена неблокирующая операция сокета не может бытьзавершено немедленно исключение
Кто-нибудь может помочь?
Спасибо.
РЕДАКТИРОВАТЬ
удалось заставить его работать.Оказывается, я недостаточно увеличил буфер.Как только я сделал буфер очень большим (1 ГБ), я получил все данные.Не уверен, почему это происходит, но там это ...