Сокет UDP Python Сервер теряет пакеты - PullRequest
0 голосов
/ 11 марта 2020

Я использую Python и у меня проблема с UDP-сокетом в качестве сервера. Я отправляю пакеты от клиента, но данные слишком велики для отправки в одном пакете (несколько мегабайт), поэтому я фрагментирую данные в пакетах по 65 КБ (IP фрагментирует их в пакетах по 1500 байт (MTU) и повторно собирает их на сервере). Я вижу пакеты в Wiresharks, поэтому в передаче нет проблем.

Код передачи:

while(end == False):

        if total_length - count >= MTU:
            length_send = self._socket.sendto(msgbuff[count:count + MTU],(IP,PORT))
        else:
            length_send = self._socket.sendto(msgbuff[count:],(IP,PORT))

        count += length_send
        if count == total_length:
            end = True

Проблема в получении. Я использую заголовок syn c, чтобы знать, где начинаются данные (например, некоторые фиксированные байты, например, 0xB451B451). В некоторых запусках сервер работает хорошо и находит заголовок syn c и может восстановить весь пакет.

Однако в других запусках сокеты получают только последние пакеты данных блока. Например: блок данных имеет размер 100 Кбайт, первый пакет составляет 65 Кбайт, а второй 35 Кбайт. Сокеты всегда возвращают пакет 35K.

Код сервера:

while not synchronized_flag:
        msg, __ = self._socket.recvfrom(MTU)
        seq_sync = msg[0:length(SYNQ_HEADER)]
        if seq_sync == SYNQ_HEADER:
            synchronized_flag = True

total_length = getLength(msg)
bytes_read = 0
while bytes_read < total_length:
            msg_aux, _ = self._socket.recvfrom(MTU)
            msg.extend(msg_aux)
            bytes_read += len(msg_aux)

Спасибо за вашу поддержку.

Кроме того, я должен сказать, что могу ' Я не использую TCP, потому что мне нужна максимальная скорость, которую я могу получить.

1 Ответ

0 голосов
/ 11 марта 2020

Помните, что UDP не является надежным протоколом и поэтому часто используется для приложений, таких как потоковое видео, но не в тех случаях, когда каждый пакет должен быть принят правильно.

Вам придется принять решение, если вы хотите установить sh надежное соединение (за счет больших издержек и меньшей скорости) или соединение с минимальными издержками (за счет потенциально потерянных пакетов) ,

...