Размер UDP-пакетов и фракции - PullRequest
0 голосов
/ 24 мая 2011

Допустим, я пытаюсь отправить данные с использованием сокета udp. Если данные большие, то я думаю, что данные будут разделены на несколько пакетов и отправлены по назначению.

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

Ответы [ 3 ]

4 голосов
/ 24 мая 2011

Если вы просто отправляете данные в одной дейтаграмме, используя один вызов send(), то фрагментация и повторная сборка будут выполняться для вас транспортным уровнем.Все, что вам нужно сделать, это предоставить достаточно большой буфер для recv(), и если все фрагменты будут получены, они будут собраны и представлены вам как одна дейтаграмма.

По сути, это сервискоторый предоставляет вам UDP (где «датаграмма» - это отдельный блок данных, отправленных одним send() вызовом):

  • датаграмма может вообще не прийти;
  • датаграмма может поступить не в порядке относительно других дейтаграмм;
  • датаграмма может прибыть более одного раза;
  • Если датаграмма действительно поступит, она будет завершенаи исправьте 1 .

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


1.В любом случае исправьте с вероятностью, подразумеваемой контрольной суммой UDP.

0 голосов
/ 24 мая 2011

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

http://en.wikipedia.org/wiki/User_Datagram_Protocol

Если вы не можете позволить себе потерянные пакеты, то, вероятно, TCP - лучший вариант, чем UDP, поскольку он обеспечивает такую ​​гарантию из коробки.

0 голосов
/ 24 мая 2011

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

С другой стороны, UDP используется, когда пакет становится неактуальным через ~ 500 мс.Это используется в играх, телефонии и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...