Что я должен знать о программировании UDP?

Нет необходимости определять две вложенные функции. Определите одну функцию следующим образом:

def calculate():

    side = entry_variable.get()
    area = side * side
    area_variable.set(area)
    perimeter = 4 * side
    perimeter_variable.set(perimeter)
17
задан Anthony 28 April 2009 в 18:10
поделиться

12 ответов

"i should assume if i send 200bytes i may get 120 and 60bytes separately?"

When you're sending UDP datagrams your read size will equal your write size. This is because UDP is a datagram protocol, vs TCP's stream protocol. However, you can only write data up to the size of the MTU before the packet could be fragmented or dropped by a router. For general internet use, the safe MTU is 576 bytes including headers.

"i should worry about another connection sending me bad data on the same port?"

You don't have a connection, you have a port. You will receive any data sent to that port, regardless of where it's from. It's up to you to determine if it's from the right address.

If data doesnt arrive typically how long may i (typically) not see data в течение (250 мсек? 1 секунда? 1,75 сек?)

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

19
ответ дан 30 November 2019 в 10:20
поделиться

Должен ли я беспокоиться о другом соединение отправляет мне плохие данные на тот же порт?

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

Однако, если вы Я хочу избежать этого и принимать пакеты только от одного узла, который вы можете вызвать connect на своем сокете UDP. Это приводит к тому, что стек IP отклоняет пакеты, поступающие с любого хоста: комбинированного порта (сокета), отличного от того, с которым вы хотите общаться.

Второе преимущество вызова connect на вашем сокете UDP заключается в том, что в во многих ОС это дает значительное улучшение скорости / задержки. Когда вы вызываете sendto через неподключенный сокет UDP, ОС фактически временно подключает сокет, отправляет ваши данные и затем отключает сокет, добавляя значительные издержки.

Третье преимущество использования подключенных сокетов UDP - это позволяет вам получать сообщения об ошибках ICMP обратно в ваше приложение, такие как маршрутизация или неизвестный хост из-за сбоя. Если UDP-сокет не подключен, ОС не будет знать, куда доставлять сообщения об ошибках ICMP из сети, и будет молча отбрасывать их, что может привести к зависанию приложения во время ожидания ответа от сбойного хоста (или ожидания вашего выберите время ожидания).

Третье преимущество использования подключенных UDP-сокетов состоит в том, что он позволяет вам получать сообщения об ошибках ICMP обратно в ваше приложение, такие как маршрутизация или неизвестный хост из-за сбоя. Если UDP-сокет не подключен, ОС не будет знать, куда доставлять сообщения об ошибках ICMP из сети, и будет молча отбрасывать их, что может привести к зависанию приложения во время ожидания ответа от сбойного хоста (или ожидания вашего выберите время ожидания).

Третье преимущество использования подключенных UDP-сокетов состоит в том, что он позволяет вам получать сообщения об ошибках ICMP обратно в ваше приложение, такие как маршрутизация или неизвестный хост из-за сбоя. Если UDP-сокет не подключен, ОС не будет знать, куда доставлять сообщения об ошибках ICMP из сети, и будет молча отбрасывать их, что может привести к зависанию приложения во время ожидания ответа от сбойного хоста (или ожидания вашего выберите время ожидания).

9
ответ дан 30 November 2019 в 10:20
поделиться

Ваш пакет может не попасть туда.

Ваш пакет может попасть туда дважды или даже чаще.

Ваши пакеты могут быть не в порядке.

У вас есть ограничение по размеру на ваши пакеты, наложенные базовыми сетевыми уровнями. Размер пакета может быть довольно маленьким (возможно 576 байт).

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

8
ответ дан 30 November 2019 в 10:20
поделиться

Фрагментация и повторная сборка происходит на уровне IP, поэтому вам не нужно об этом беспокоиться (Википедия) . (Это означает, что вы не будете получать расщепленные или усеченные пакеты.)

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

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

6
ответ дан 30 November 2019 в 10:20
поделиться

UDP - это протокол без установления соединения. Отправка данных через UDP может попасть в получатель, но также может быть потеряна во время передачи. UDP идеально подходит для вещания и потоковой передачи аудио или видео (т. Е. В таких ситуациях пропущенный пакет никогда не является проблемой). Поэтому, если вам нужно убедиться, что ваши данные попадают на другую сторону, придерживайтесь протокола TCP.

UDP имеет меньше накладных расходов, чем TCP, и поэтому работает быстрее. (TCP должен сначала установить соединение, а также проверяет пакеты данных на предмет повреждения данных, что требует времени.)

Фрагментированные пакеты UDP (т.е. пакеты, размер которых превышает примерно половину килобайта), вероятно, будут отбрасываться маршрутизаторами, поэтому перед отправкой разбивайте свои данные на небольшие порции. (В некоторых случаях ОС может позаботиться об этом.) Обратите внимание, что это всегда пакет, который может сделать это или нет. Половина пакетов не обрабатывается. 1245. Задержка на больших расстояниях может быть довольно большой. Если вы хотите выполнить повторную передачу данных, я бы выбрал примерно 5-10-кратное время задержки старения для текущего соединения. (Вы можете измерить задержку, отправив и получив несколько пакетов.)

Надеюсь, это поможет.

Если вы хотите выполнить повторную передачу данных, я бы выбрал примерно 5-10-кратное время задержки старения для текущего соединения. (Вы можете измерить задержку, отправив и получив несколько пакетов.)

Надеюсь, это поможет.

Если вы хотите выполнить повторную передачу данных, я бы выбрал примерно 5-10-кратное время задержки старения для текущего соединения. (Вы можете измерить задержку, отправив и получив несколько пакетов.)

Надеюсь, это поможет.

4
ответ дан 30 November 2019 в 10:20
поделиться

При попытке использовать UDP важно знать следующее:

Ваши пакеты могут не все пройти через линию, что означает, что возможно повреждение данных.

Если вы работаете с приложением, которому необходимо 100% данных для надежной доставки для обеспечения функциональности, используйте TCP. Если вы работаете с приложением, в котором допустимы некоторые потери (потоковое мультимедиа и т. Д.), Тогда переходите на UDP, но не ожидайте, что все из одного канала в другой останется невредимым.

3
ответ дан 30 November 2019 в 10:20
поделиться

One way to look at the difference between applications appropriate for UDP vs. TCP is that TCP is good when data delivery is "better late than never", UDP is good when data delivery is "better never than late".

Another aspect is that the stateless, best-effort nature of most UDP-based applications can make scalability a bit easier to achieve. Also note that UDP can be multicast while TCP can't.

2
ответ дан 30 November 2019 в 10:20
поделиться

В дополнение к рекомендации don.neufeld использовать TCP.

Для большинства приложений проще реализовать TCP. Если вам необходимо поддерживать границы пакетов в потоке TCP, хорошим способом является передача двухбайтового заголовка перед данными для разграничения сообщений. Заголовок должен содержать длину сообщения. На приемном конце просто прочитайте два байта и оцените значение. Тогда просто подождите, пока вы не получите столько байтов. После этого вы получите полное сообщение и готовы получить следующий 2-байтовый заголовок.

Это дает вам некоторые преимущества UDP без хлопот с потерянными данными, поступлением неупорядоченных пакетов и т. Д.

2
ответ дан 30 November 2019 в 10:20
поделиться

Если на пути есть ограничение размера пакета, наложенное некоторым маршрутизатором, ваши UDP-пакеты могут быть незаметно обрезаны до этого размера.

1
ответ дан 30 November 2019 в 10:20
поделиться

Две вещи:

1) Вы можете или не можете получить то, что было отправлено

2) Все, что вы получили, может быть не в том же порядке, в котором оно было отправлено.

0
ответ дан 30 November 2019 в 10:20
поделиться

И не думайте, что если вы отправите пакет, он туда попал.

1
ответ дан 30 November 2019 в 10:20
поделиться

Я не буду следовать примеру других людей, которые ответили на этот вопрос, все они, кажется, подталкивают вас к TCP, и это совсем не для игр, за исключением, может быть, информации для входа / чата. Пойдем по порядку:

Нужно ли мне беспокоиться о неверных данных в моем сокете?

Да. Несмотря на то, что UDP содержит чрезвычайно простую контрольную сумму для маршрутизаторов и т. П., Он не эффективен на 100%. Вы можете добавить свое собственное устройство контрольной суммы, но большую часть времени UDP используется, когда надежность уже не является проблемой, поэтому данные, которые не соответствуют, следует просто отбросить.

Я должен предположить, что если я отправлю 200 байт, я могу получить 120 а 60 байт отдельно?

Нет, UDP - это прямая запись и чтение данных. Однако, если данные слишком велики, некоторые маршрутизаторы будут усекать, и вы потеряете часть данных навсегда. Некоторые сказали примерно 576 байт с заголовком, я лично не стал бы t использовать более 256 байт (хорошее круглое число log2).

Следует ли мне беспокоиться о том, что другое соединение отправит мне неверные данные на тот же порт?

UDP прослушивает любые данные с любого компьютера на порту, так что в этом смысле да. Также обратите внимание, что UDP является примитивом, и необработанный формат может использоваться для подделки отправителя, поэтому вы должны использовать своего рода «ключ», чтобы прослушиватель мог проверить отправителя по его IP.

Обычно данные не приходят. как долго я могу (обычно) не видеть данные (250 мс? 1 секунду? 1,75 с?)

Данные, отправленные по UDP, обычно являются одноразовыми, поэтому, если вы не получаете данные, их можно легко проигнорировать ... тем не менее, иногда вам нужен «полунадежный», но не «упорядоченный надежный», как в случае TCP, 1 секунда - хорошая оценка падения. Вы можете пронумеровать свои пакеты в ротации и написать собственное сообщение ACK. Когда пакет получен, он записывает номер и отправляет обратно битовое поле, позволяя отправителю узнать, какие пакеты он получил. Вы можете прочитать этот незаконченный документ для получения дополнительной информации (хотя и незаконченный, он все же дает достоверную информацию):

http://gafferongames.com/networking-for-game-programmers/

4
ответ дан 30 November 2019 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: