Исходные коды программ и игр

Программирование - работа и хобби

Исходник отправки сообщения по сети UDP (часть 1)

Язык программирования C#

О протоколе UDP

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

Суть исходника

Исходник написан на языке программирования C#, первая часть исходника предназначена для ознакомления с высокоуровневым классом UdpClient, не отвлекаясь на другие детали. Для отправки и извлечения сообщений используются блокирующие методы. Небольшие размеры отправляемых сообщений лишь на короткое время блокируют программу. Для приема сообщений не обойтись без дополнительного потока, иначе блокирование приложения может продолжаться все время работы программы.

Краткий листинг приложений


// --- ИСХОДНЫЙ КОД ОТПРАВКИ СООБЩЕНИЙ ---
// Отправка сообщения
void SendMessage()
{
   UdpClient udp = new UdpClient();

   // Указываем адрес отправки сообщения
   IPAddress ipaddress = IPAddress.Parse(textBoxAddress.Text);
   IPEndPoint ipendpoint = new IPEndPoint(ipaddress, 15000);

   // Формирование оправляемого сообщения и его отправка.
   // Сеть "понимает" только поток байтов и ей безразличны
   // объекты классов, строки и т.п. Поэтому преобразуем текстовое
   /// сообщение в поток байтов.
   byte[] message = Encoding.Default.GetBytes(textBoxSend.Text);
   int sended = udp.Send(message, message.Length, ipendpoint);

   // Если количество переданных байтов и предназначенных для 
   // отправки совпадают, то 99,9% вероятности, что они доберутся 
   // до адресата.
   If (sended == message.Length)
   {
      // все в порядке
      textBoxSend.Text = "";
   }
      

   // После окончания попытки отправки закрываем UDP соединение,
   // и освобождаем занятые объектом UdpClient ресурсы.
   udp.Close();
}


// --- ИСХОДНЫЙ КОД ИЗВЛЕЧЕНИЯ СООБЩЕНИЙ ---

// Запуск отдельного потока для приема сообщений
void StartReceive()
{
   rec = new Thread(new ThreadStart (Receive));
   rec.Start();
}

// Функция извлекающая пришедшие сообщения
// работающая в отдельном потоке.
void Receive()
{
   // При принудительном завершении работы метода 
   // класса UdpClient Receive() и непредвиденных ситуациях 
   // возможны исключения в этом месте исходного кода,
   // заключим его в блок try чтобы не появлялись окна ошибок.
   try
   {
      // Перед созданием нового объекта закрываем старый
      // для освобождения занятых ресурсов.
      if (udp != null) udp.Close();

      udp = new UdpClient(15000);
                  
      while (true)
      {

         IPEndPoint ipendpoint = null;
         byte[] message = udp.Receive(ref ipendpoint);
         textBox2.Text = Encoding.Default.GetString(message);

         // Если дана команда остановить поток, останавливаем бесконечный цикл.
         if (stopReceive == true) break;
      }  
                     
      udp.Close();
     }
     catch
     {
     }
}


// Функция безопасной остановки дополнительного потока
void StopReceive()
{
   // Останавливаем цикл в дополнительном потоке
   stopReceive = true;

   // Принудительно закрываем объект класса UdpClient 
   if (udp != null) udp.Close();

   // Для корректного завершения дополнительного потока
   // подключаем его к основному потоку.
   if (rec != null) rec.Join();
}

Файлы исходника для скачивания

Примечания: Исходник состоит из двух приложений: первая отправляет сообщение, вторая извлекает сообщение. Для тестирования исходного кода необходимо разрешить программу извлечения сообщений в брандмауэре операционной системы.

Исходник создан в среде программирования MS Visual Studio 2012 .NET, Framework 4.0.

Файл загрузки Размер Кол-во загрузок
udplocal1csharp_vs11.zip 💾 41Кбайт 4437