C# - Üzenet küldése UDP szolgáltatással

forráskód letöltése
A .NET System.NET.Socket névterében megtalálható osztályokkal a legváltozatosabb módon és szoftvercsatornán keresztül kommunikálhatnak alkalmazásaink. A TCP port-on zajló adatcsere mellett van lehetőség arra, hogy a User Datagram Protocol (UDP) szolgáltatásait vegyük igénybe adataink vagy üzeneteink elküldéséhez. Cikkünkben elkészítünk két alkalmazást, melyek a kommunikációnak ezt a formáját választják.
A mellékelt példa kipróbálásakor elsőként az UDPServer alkalmazást kell elindítani, majd ezt követően az UDPClient programot.
Az UDP szolgáltatás révén kihasználhatjuk, hogy az üzenetküldés egyszerű, és egy időben akár több félnek is elküldhető az adott üzenet (broadcast). Az UDP legfontosabb jellemzője, hogy úgynevezett kapcsolat nélküli protokoll, azonban ezzel együtt igaz az is, hogy semmiféle garancia nincs arra, hogy az adott üzenet megérkezik a címzetthez, illetve az, hogy az üzenet a kiindulási formában jut el a végcélhoz.
Az üzenet elküldéséhez ismernünk kell a célállomás nevét, vagy IP címét, valamint a port számát, melyen a kommunikáció zajlik. Annak érdekében, hogy az üzenet több célhoz jusson el, egy tartomány IP címét kell megadnunk, és így az üzenet eljut a tartomány valamennyi klienséhez.
Szerveralkalmazás
A mellékelt példában a szerveralkalmazás induláskor létrehoz és elindít egy figyelő szálat, mely folyamatosan ellenőrzi a szoftvercsatornát, majd a kapott üzenetet – mely a klienstől jön – kiírja a ListBox kontrolba, közben egy választ is küld a kliensnek.
ut = new Thread(new ThreadStart(Listen));
ut.Start();
A két alkalmazás a 4568 számú port-on fog kommunikálni, a kliens-alkalmazásban is ezt kell megadnunk. A Listen metódus végzi el a csatorna pásztázását, majd a kapott üzenet feldolgozását. A port választásánál ügyelnünk kell arra, hogy 1024-nél ne legyen nagyobb.
A kommunikáció felépítéséhez deklarálnunk kell egy Socket objektumot.
udpsocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
Valamint egy IPHostEntry objektumot.
localhost = Dns.GetHostByName(Dns.GetHostName());
Egy WHILE ciklusban figyeljük a port-ot, melyben lekérdezzük a szerverre csatlakozó valamennyi kliens címét, majd a kapott üzeneteket dekódoljuk.
while (true)
{
  Byte[] r = new Byte[256];
  IPEndPoint temp = new IPEndPoint(localhost.AddressList[0], 4568);
  EndPoint remote = (temp);
  int b = udpsocket.ReceiveFrom(r, ref remote);
  String data = Encoding.Default.GetString(r);
  ...
Látható, hogy a ReceiveFrom metódussal kérdezzük le az üzeneteket.
  String sendstr = "Az üzenet megérkezett!";
  Byte[] rbyte = Encoding.Default.GetBytes(sendstr.ToCharArray());
  udpsocket.SendTo(rbyte,remote);
}
A választ pedig a SendTo metódussal küldjük el.
Kliensalkalmazás
A kliensben a Send metódusban implementáljuk az üzenetküldést. Ekkor egy szervernevet kell megadnunk a Form felületén az üzenet küldése előtt. A módszer egyszerű. Példányosítjuk az UdpClient osztályt a szervernévvel, és a port számával.
udpClient = new UdpClient(servername,4568);
A megadott üzenetet egy bájttömbben helyezzük el.
Byte[] messagebyte = new Byte[256];
messagebyte = Encoding.Default.GetBytes(textBox1.Text.ToCharArray());
A távoli pontba pedig elküldjük az üzenetet a Send metódus meghívásával.
IPHostEntry remote = Dns.GetHostByName(servername);
IPEndPoint endpoint = new IPEndPoint(remote.AddressList[0], 4568);
int s = udpClient.Send(messagebyte,messagebyte.Length);
A kliens csak a kapcsolat idejére kapcsolódik, és ekkor rögtön le is kérdezzük a kapott választ, mert erre később már nincs mód.
Byte[] r = new Byte[512];
r = udpClient.Receive(ref endpoint);
string data = Encoding.Default.GetString(r);