Вернуться   XekSecurity > Программирование > C#, VB.NET
Новые сообщенияНовые сообщения
Аренда магазина аккаунтов
Deer.IO - Создай свой магазин аккаунтов Реклама на форуме

Ответ
 
Опции темы Опции просмотра

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

Старый 12.07.2011, 16:02   #1 (permalink)
Moderator
 
Аватар для MYSTiQUE
 
MYSTiQUE вне форума
Регистрация: 01.11.2008
Сообщений: 504
Репутация: 965
Exclamation Исходник: отправка сообщения по сети UDP на C# (часть 1)





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

Исходник написан на языке программирования C#, часть 1 исходника предназначена только для ознакомления с высокоуровневым классом 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 2010 Express. Windows XP и выше. Framework 4.0.

Скачать рабочий исходник
__________________
Quod me nutrit me destruit
  Ответить с цитированием

Рекламные ссылки:
Insorg

Старый 16.11.2014, 09:52   #2 (permalink)
Новичок
 
rtkm вне форума
Регистрация: 04.04.2012
Сообщений: 8
Репутация: 0
По умолчанию

Вместо UdpClient лучше было бы использовать SharpPcap - в этом случае можно было бы отправлять пакеты UDP с подменой IP адреса отправителя (источника)
  Ответить с цитированием
Ответ

Метки
c#


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Друзья форума: Хакерский софт