Странное поведение сети с UDP-сокетами и python - PullRequest
1 голос
/ 16 августа 2011

Я сделал несколько сценариев Python и запустил их как на своем компьютере, так и на удаленной оболочке (на некотором веб-сайте, обеспечивающем доступ к оболочке).

Я использую потоки, каналы и UDP-сокеты для передачи данных в P2Pмода, поэтому каждый скрипт может получать и отправлять через один и тот же сокет.Чтобы проверить, работает ли это, я открываю один терминал на моем компьютере и еще один терминал с помощью ssh, подключенного к моей оболочке.Я проверяю, что скрипт одинаков на обеих машинах, и передаю его по IP-адресу.

Вот сценарий: http://codepad.org/V9Q1KcDT

(я не знаю, стоит ли вставлятьэто прямо здесь или нет)

Моя проблема заключается в следующем: отправляемые мной строки, кажется, получают что-то в 20% случаев, иногда часто, иногда нет, и это кажется случайным ...

Что я делаю неправильно ?UDP так ненадежен?Поток Python + труба + сокет слишком медленный?Может ли быть какая-то проблема с сетью у моего провайдера оболочки?Моя программа имеет недостатки?Являются ли каналы хорошим решением для связи с потоками?

У меня нет проблем с использованием оболочки, и я не пробовал, но это полезно для целей тестирования.

Кстати, если я ведумаршрутизатор, как маршрутизатор знает, куда отправить пакет, если я не единственный компьютер, подключенный?(Я пытался, когда я был единственным, он вел себя одинаково).

1 Ответ

0 голосов
/ 16 августа 2011

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

Тем не менее, многопоточность, многопроцессорность и удаленные машины и сети - это множество переменных, которые нужно диагностировать одновременно. Я бы посоветовал вам сделать шаг назад и попытаться свести проблему к чему-то более простому.

Например:

  • сначала попробуйте TCP вместо UDP
  • вместо потоков, запустить 2 процесса (один выполняет nit_send, другой - nit_recv)
  • запустите их на локальном компьютере (используйте localhost: 127.0.0.1)

Как только у вас будет работать этот базовый тест, добавьте функции обратно. Например, переключитесь на UDP. Как только у вас возникнут проблемы с UDP, попробуйте ввести удаленные машины или потоки и т. Д.

Что касается вопроса о маршрутизаторе, то все компьютеры, подключенные к вашему маршрутизатору, скорее всего, используют NAT, поэтому все они имеют одинаковый IP-адрес (IP-адрес вашего маршрутизатора) для компьютеров в Интернете. Посмотрите на NAT и переадресацию портов, если вы хотите направить трафик на конкретную машину в вашей локальной подсети.

...