Red de conocimiento informático - Computadora portátil - Cómo utilizar el protocolo UDP para comunicación asíncrona en C#

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

{

//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,

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;?}

//?

>p>

//?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;

}

}

}

}

?