
Исходник на языке C#, для тестирования и изучения протокола UDP. Тестовая программа рассчитана на передачу сообщений по локальной сети. Для взаимодействия двух программ на одном компьютере необходимо изменить ip хост-адрес одной на 127.0.0.2. У другой же программы изменить удаленный ip адрес на 127.0.0.2. Только в этом случае программы, работающие по протоколу UDP, смогут общаться на одной машине. Это связано с тем, что невозможно запустить две прослушивающие (извлекающие сообщения) программы с одинаковыми ip адресами и одинаковыми портами. На разных машинах программы будут работать нормально, и отсылать, получать сообщения без проблем. Протокол UDP позволяет работать по сети без установки соединения, что и демонстрируют тестовые программы. Хотя использованы блокирующие методы, но при использовании их в отдельном потоке основной поток полностью владеет интерфейсом программы и не блокируется.
void Send()
{
UdpClient udp = new UdpClient();
byte[] message = Encoding.Default.GetBytes(textBoxSend.Text);
IPEndPoint ep = new IPEndPoint
(IPAddress.Parse(textBoxRemote.Text), 15000);
udp.Send(message, message.Length, ep);
udp.Close();
}
void StartReceive()
{
ThreadStart tstart = new ThreadStart(Receive);
workReceive = new Thread(tstart);
workReceive.Start();
}
bool stopReceive = false;
Thread workReceive = null;
UdpClient udp = null;
void Receive()
{
try
{
IPEndPoint ep =
new IPEndPoint(IPAddress.Parse(textBoxHostAddress.Text), 15000);
udp = new UdpClient(ep);
while (true)
{
IPEndPoint remote = null;
byte[] message = udp.Receive(ref remote);
ShowMessage(Encoding.Default.GetString(message) );
if (stopReceive == true) break;
}
}
catch(Exception e)
{
}
finally
{
if (udp != null) udp.Close();
}
}
delegate void SetTextCallback(string message);
void ShowMessage(string message)
{
if (this.textBoxReceive.InvokeRequired)
{
SetTextCallback dt = new SetTextCallback(ShowMessage);
this.Invoke(dt, new object[] { message });
}
else
{
this.textBoxReceive.Text = message;
}
}
void StopReceive()
{
stopReceive = true;
if (udp != null) udp.Close();
if (workReceive != null) workReceive.Join();
}
void FormClosing()
{
StopReceive();
}
Примечание. Исходник тестировался в MS Visual Studio 2010 Express, Pro. Операционная система Windows, .NET Framework 4.0.