Частичный пакет UDP при получении отPython

Программы на Python
Ответить
Anonymous
 Частичный пакет UDP при получении от

Сообщение Anonymous »

Когда я пишу TCP-сервер, я обычно использую следующую функцию в качестве надежной функции приема:

Код: Выделить всё

def _recv(socket, size: int):
data        = []
received    = 0
while size != received:
chunk, _ = socket.recv(size - received)
data.append(chunk)
received += len(chunk)
return b''.join(data)
Поэтому, если Recv вернул меньше size байт, он будет продолжать получать до тех пор, пока не будет получено полное сообщение.

Сейчас я пишу UDP-сервер, так как UDP — непотоковый протокол, я не могу использовать Recvfrom дважды для чтения одного и того же пакета, поэтому я использую код следующим образом:

Код: Выделить всё

def _recvfrom(socket, size: int):
return socket.recvfrom(size)[0]
От человека 2, полученного:

Код: Выделить всё

These calls return the number of bytes received, or -1 if an error occurred.
In the event of an error, errno is set to indicate the error.
Мы понимаем, что Recvfrom может возвращать только частичные данные (скажем, UDP-пакет имеет размер 100 байт, а Recvfrom возвращает 50 байт из-за программное прерывание).

Мой вопрос: как отличить частичный пакет UDP от полного пакета UDP, полученного от Recv_from? Или, более конкретно, как отличить Recvfrom, завершившийся из-за программного прерывания, от успешного?

Подробнее здесь: https://stackoverflow.com/questions/578 ... n-recvfrom
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»