Отправка пакетов UDP через Verizon Aircard - PullRequest
1 голос
/ 08 декабря 2011

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

Вот моя ситуация. У моего клиента есть программное обеспечение, которое отправляет и получает пакеты UDP. Программное обеспечение конечного пользователя работает на ноутбуке, подключенном через воздушную карту Verizon. (Я объясню, почему это важно позже ...) Они хотят, чтобы я запрашивал отчет с сервера через заданный интервал времени, поэтому им не нужно забывать запрашивать его с сервера. Чтобы сделать это, я должен заставить сервер думать, что я его клиентское программное обеспечение, и выполнить мою просьбу. Это не так плохо, как кажется.

Моя программа отправляет свой запрос на сервер через пакет UDP. Сервер считает, что запрос поступил от собственного клиентского программного обеспечения, и отправляет результат обратно клиенту. Их мобильный клиент обрабатывает информацию, и моя программа бездействует до следующего интервала. Все счастливы. Я получил эту работу, поместив wireshark в систему и наблюдая за пакетами, идущими туда-сюда, а затем разбирая UDP-пакеты.

Согласно wireshark, клиент отправляет свой пакет через порт 6767, а сервер получает его через порт 6868. Я смог заставить это работать, когда был подключен к их сети напрямую (в качестве теста). Однако, когда я перенес свое программное обеспечение в мобильное устройство, работающее на платформе verizon, оно не работает. Насколько я могу судить, пакеты все еще идут вверх, но они не распознаются сервером. И проблема в том, что Wireshark не будет захватывать пакеты с карты Verizon, поэтому я не могу сравнивать байты - как я делал в сети. Мой клиент, который, кажется, немного одурманен при обсуждении сетевых вещей, говорит мне, что порты остаются неизменными, независимо от того, находятся ли они в сети или на карте.

Простой код, который я запускаю, выглядит следующим образом:

public void transmitUDPDataPacket(string IP, string portStr)
 {
    Int32 port = 0;
    try
     {
          port = Convert.ToInt32(portStr);
      }
    catch (Exception ex)
      {
         resultFailed("FAILED: transmitDataPacket " + ex.Message);
         return;
      }
    Socket sending_socket = new Socket(AddressFamily.InterNetwork, 
                          SocketType.Dgram, ProtocolType.Udp);
    IPAddress send_to_address = IPAddress.Parse(IP);
    IPEndPoint sending_end_point = new IPEndPoint(send_to_address, port);
     try
      {
        sending_socket.SendTo(data, data.Length, SocketFlags.None, sending_end_point);
      }
etc.

Итак, несколько вопросов:

  1. Я знаю, как указать конечную точку (то есть 6868) в моей команде UDP. Но я не посмотрите, где я указываю, через какой порт он выходит с моего конца (т.е. 6767). Есть такая вещь?
  2. Если не покупать специальное программное обеспечение, есть ли оно в любом случае? захватить пакеты Verizon Aircard?
  3. Какой тип перечисления SocketType мне следует использовать? В настоящее время я Я использую Dgram, но я думал о переходе на RDM - хотя я не думаю, что здесь что-то изменится, так или иначе, это была мысль.

1 Ответ

1 голос
/ 08 декабря 2011

Для пункта № 1: Вы ищете метод Bind().

Для пункта № 3: придерживайтесь Dgram, что примерно переведет в UDP. Доступны другие методы дейтаграмм: RUDP , UDP-lite , DCCP , RDS , но обычный старый UDP будет передаваться через общедоступный Интернет гораздо проще, чем любая другая альтернатива.

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