Cómo utilizar el protocolo UDP para comunicación asíncrona en C#
Servidor UDP: usando?System;
usando?System.Text;
usando?System.Net;
usando?System .Net.Sockets;
espacio de nombres?ConsoleUdpServer
{
clase?Programa
{
estático? void?Main(string[]?args)
{
Socket?Socket(AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
EndPoint?0.0.1"),?8002);
socket.Bind(localEP);
//Iniciar asíncrono Recibir
State?state?=?new?BeginReceiveFrom(
state.Buffer,?0,?state.Buffer.Length,
SocketFlags.None,
ref?ReadLine();
socket.Close();
}
//Función asincrónica RecibirDeCallback
static?void?EndReceiveFromCallback(IAsyncResult?iar)
{
Estado?Socket;
prueba
{ p>
//Recepción completa
int?byteRead?=?socket.EndReceiveFrom(iar,?ref?state.RemoteEP);
/Mostrar dirección y puerto del cliente
Console.WriteLine("Punto final del cliente: {0}",?state.RemoteEP.ToString());
state.Buffer,?0,?Buffer.Length, p>
SocketFlags.None,
ref?state.RemoteEP,
EndReceiveFromCallback,
estado);
}
}
//?
//?Enviar un mensaje al cliente
//?
//? Socket local (socket de servidor)
//?Punto final del cliente
//? Mensaje
static?void?SendMeaage(Socket?socket, ?EndPoint?remoteEndPoint, ?string?Message)<
{
byte[]?bytes?=?Encoding.Default.GetBytes(Message);
socket.SendTo(bytes ,?remoteEndPoint);<
/p>
}
}
//?
//?Clase auxiliar para procesamiento de recepción asíncrono
//?
clase?Estado
{
¿público?Estado(Socket?socket)
{
este.Buffer?Buffer?=?new?byte[1024];
este.Socket?=?socket;
este.RemoteEP?= ?new ?IPEndPoint(IPAddress.Any,?0);
}
//?
//?Obtener el socket local (servidor)
//?
¿público?Socket?{?get;?privado?set;?}
//? //?Obtener el búfer de recepción //?
public?byte[]?Buffer?{?get; ?set;?}
//?
//?
//?Obtener/establecer punto final del cliente
////?
public?EndPoint?RemoteEP;
}
}
Uso del cliente UDP ?System;
Usando ?System.Text;
Usando ?System.Net;
usando ?System.Net.Socket;
espacio de nombres?ConsoleUdpClient
{
clase?Programa
{
estática?void?Main(string[]?args)
{
Socket?Dgram,
ProtocolType.Udp);
//Punto final utilizado por el cliente
EndPoint?localEP ?=?new?IPEndPoint(IPAddress.Any,?0);
socket.Bind(localEP);
//Iniciar recepción asincrónica
¿Estado? estado?=?nuevo?Estado(socket);
socket.Bind(localEP);
Estado?BeginReceiveFrom(
state.Buffer,?0,?state.Buffer.Length,
SocketFlags.None,
ref?state.RemoteEP,
EndReceiveFromCallback,
state);
//Enviar mensaje al servidor
EndPoint?remoteEP?=?new?IPEndPoint(IPAddress.Parse("127.0.0.1" ),?8002 );
SendMeaage(socket,?remoteEP, ?"" Hola, este es el cliente, ¡responda cuando lo reciba!Ov
er~~~~");
Console.ReadLine();
socket.Close();
}
/ / Función de devolución de llamada de recepción asincrónica
static?void?EndReceiveFromCallback(IAsyncResult?iar)
{
State?Socket;
try
{
//Recepción completa
int?byteRead?=?socket.EndReceiveFrom(iar,?ref?state.RemoteEP);
/Mostrar dirección y puerto del servidor
Console.WriteLine("Punto final del servidor: {0}",?state.RemoteEP.ToString());
state.Buffer,? 0,?state.Buffer.Length,
SocketFlags.None,
ref?state.RemoteEP,
EndReceiveFromCallback,
estado );
}
}
//?
//?Enviar un mensaje al servidor
//?
//? Socket local
//?
//? Punto final del servidor
//? Mensaje
static?void?SendMeaage(Socket?socket,?EndPoint?remoteEndPoint,?string?Message)<
{
byte[]?bytes?=?Encoding.Default. GetBytes( Mensaje);
socket.SendTo(bytes,?remoteEndPoint);
}
}
//?
//?Clase auxiliar para procesamiento de recepción asíncrona
//?
class?State
{
¿público?Estado(Socket?socket)
{
este.Buffer?Buffer?=?new?byte[1024];
this.Socket?=?socket;
this.RemoteEP?=?new?IPEndPoint(IPAddress.Any,?0);
}
/ /?
//?Obtener socket local
//?
public?Socket?Socket?{?get ;? private?set;?}
//?
//?Obtener el búfer de recepción
//? >
público?byte[]?Buffer?{?get;?privado
?set;?}
//?
//?
//?Obtener/establecer el punto final del cliente
//?
público?EndPoint?RemoteEP;
}
}
}
}
?