Каковы некоторые возможные причины отклонения UDP-пакета iPhone? - PullRequest
4 голосов
/ 20 февраля 2010

На iPhone я запускаю приложение с библиотекой AsyncUdpSocket, чтобы заботиться о сетях UDP. Я проверил это. Я могу отправить UDP-пакет со своего iPhone на сервер, на котором Java-программа правильно принимает UDP.

Однако, когда все наоборот, UDP-сообщение Java-программы не доходит до iPhone. Поэтому я решил проверить библиотеку, может ли она отправлять / получать свои собственные пакеты UDP или нет используя 127.0.0.1 на iPhone, и в результате он работает.

Итак, мне было интересно, отправляются ли UDP-пакеты или нет, поэтому я использовал Wireshark, чтобы увидеть мою сетевую активность.

alt text

Прямая ссылка на изображение выше: http://img46.imageshack.us/img46/7939/screenshot20100220at110.png

В программе iPhone я приказываю своей программе UDP подключиться к 192.168.99.11, который является моим MacBook, с использованием порта 55555. Программе Java UDP на моем Macbook говорят, что удаленный ip для подключения - 192.168.99.13 (мой iPhone) через порт 55555.

В Wireshark я вижу, что ICMP сообщает мне, что пункт назначения и порт недоступны для iPhone.

Так кто-нибудь знает, почему iPhone блокирует UDP-пакеты? Или я что-то упускаю из виду?

1 Ответ

2 голосов
/ 21 февраля 2010

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

Позвольте мне описать нормальный сценарий клиент-сервер (a.k.a активный / пассивный):

  1. сервер создает UDP-сокет и bind(2) s соединяет его с известным портом (55555 в вашем примере),
  2. вызовы сервера recv(2) - функция семейства сокетов для приема данных от клиентов,
  3. клиент создает сокет UDP и вызывает функцию sendto(2) с аргументом адреса назначения, инициализированным IP-адресом сервера и тем известным номером порта.
  4. сервер возвращается с recv(2) с данными от клиента,
  5. Опционально клиент и сервер обмениваются дополнительными сообщениями.

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

Кстати, может быть несколько причин, по которым вы получаете ответ «ICMP port unreachable»:

  • Ни один процесс не привязан к порту на сервере (см. Пункт 1. выше),
  • Брандмауэр на компьютере сервера активно отклоняет пакеты, отправленные на этот порт.

Надеюсь, это немного прояснит. Дайте мне знать, если я неправильно понял, что вы спрашиваете.

...