Skip to content

Instantly share code, notes, and snippets.

@Konard
Created May 9, 2014 06:07
Show Gist options
  • Save Konard/f9a7f0768394121355ab to your computer and use it in GitHub Desktop.
Save Konard/f9a7f0768394121355ab to your computer and use it in GitHub Desktop.
Представляет вспомогательную сущность для получения сообщений по протоколу UDP.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Konard.Helpers
{
public delegate void MessageHandlerCallback(string message);
/// <summary>
/// Представляет вспомогательную сущность для получения сообщений по протоколу UDP.
/// </summary>
public class UdpReceiver
{
private static readonly UdpClient DefaultUdpClient = new UdpClient(15000);
private bool _disposed;
private bool _stopReceive;
private Thread _worker;
private readonly UdpClient _udp;
private readonly MessageHandlerCallback _messageHandler;
public UdpReceiver(Thread worker, UdpClient udp, bool stopReceive, MessageHandlerCallback messageHandler)
{
_worker = worker;
_udp = udp;
_stopReceive = stopReceive;
_messageHandler = messageHandler;
}
public UdpReceiver(MessageHandlerCallback messageHandler)
{
_worker = null;
_stopReceive = false;
_udp = DefaultUdpClient;
_messageHandler = messageHandler;
}
public UdpReceiver()
: this(null, DefaultUdpClient, false, message => { })
{
}
public void Start()
{
_stopReceive = false;
_worker = new Thread(Receive);
_worker.Start();
}
public void Stop()
{
_stopReceive = true;
if (_udp != null) _udp.Close();
if (_worker != null) _worker.Join();
}
// Функция извлекающая пришедшие сообщения
// и работающая в отдельном потоке.
private void Receive()
{
try
{
while (true)
{
IPEndPoint ipendpoint = null;
byte[] message = _udp.Receive(ref ipendpoint);
_messageHandler(Encoding.Default.GetString(message));
// Если дана команда остановить поток, останавливаем бесконечный цикл.
if (_stopReceive) break;
}
}
catch (Exception e)
{
// Log Exception
}
}
#region Finalizers
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// unsafe disposing here?
}
try { Stop(); } catch { }
_worker = null;
_disposed = true;
}
}
~UdpReceiver()
{
Dispose(false);
}
#endregion
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment