Acerca de la programación UDP en C#

//Este es un código fuente para que lo consultes

usando System

usando System.Net

usando System; .Net.Sockets;

usando System.Text;

usando System.Threading;

usando System.Windows.Forms;

espacio de nombres UDPClient

{

clase parcial pública frmUdp: formulario

{

UdpClient privado sendUdpClient

privado; UdpClient recibirUpdClient;

public frmUdp()

{

InitializeComponent();

IPAddress[] ips = Dns.GetHostAddresses(" ");

tbxlocalip.Text = ips[3].ToString();

int puerto = 51883;

tbxlocalPort.Text = puerto.ToString( );

tbxSendtoIp.Text = ips[3].ToString();

tbxSendtoport.Text = port.ToString()

}

//Recibir mensajes

private void btnReceive_Click(object sender, EventArgs e)

{

//Crear un socket de recepción

IPAddress localIp = IPAddress.Parse(tbxlocalip.Text);

IPEndPoint localIpEndPoint = nuevo IPEndPoint(localIp, int.Parse(tbxlocalPort.Text));

recibirUpdClient = nuevo UdpClient( localIpEndPoint);

Subproceso recibirSubproceso = nuevo Subproceso(ReceiveMessage);

recibirSubproceso.Start();

}

/ / recibir método de mensaje

private void RecibirMessage()

{

IPEndPoint remotoIpEndPoint = nuevo IPEndPoint(IPAddress.Any, 0);

while (true)

{

intentar

{ p>

// Se producirá una excepción al cerrar recibirUdpClient

byte[] recibirBytes = recibirUpdClient.Receive(ref remoteIpEndPoint);

string message = Encoding.Unicode. GetString (receiveBytes);

// Mostrar contenido del mensaje

ShowMessageforView(lstbxMessageView, string.Format("{0}[{1}]", remotoIpEndPoint, mensaje));

p>

}

atrapar

{

romper

}

}

}

//Utilice el mecanismo de devolución de llamada delegado para mostrar el contenido del mensaje en la interfaz

delegado void ShowMessageforViewCallBack(ListBox listbox, string text);

private void ShowMessageforView(ListBox cuadro de lista, texto de cadena)

{

if (listbox.InvokeRequired)

{

ShowMessageforViewCallBack showMessageforViewCallback = ShowMessageforView;

listbox.Invoke(showMessageforViewCallback, nuevo objeto[] { listbox, texto }

}

else

<); p> {

p>

lstbxMessageView.Items.Add(texto);

lstbxMessageView.SelectedIndex = lstbxMessageView.

Items.Count - 1;

lstbxMessageView.ClearSelected();

}

}

btnSend_Click privado vacío (remitente del objeto, EventArgs) e)

{

if (tbxMessageSend.Text == string.Empty)

{

MessageBox.Show("Enviar contenido "No puede estar vacío", "prompt");

return

}

// Seleccione el modo de envío

if (chkbxAnonymous). . Marcado == verdadero)

{

// Modo anónimo (el sistema asigna aleatoriamente el puerto vinculado al socket)

sendUdpClient = new UdpClient. (0 );

}

else

{

// Modo de nombre real (el socket está vinculado al especificado localmente puerto)

IPAddress localIp = IPAddress.Parse(tbxlocalip.Text);

IPEndPoint localIpEndPoint = nuevo IPEndPoint(localIp, int.Parse(tbxlocalPort.Text));

sendUdpClient = new UdpClient(localIpEndPoint);

}

Hilo sendThread = new Thread(SendMessage);

sendThread.Start(tbxMessageSend.Text) ;

p>

}

// Método de envío de mensaje

private void SendMessage(object obj)

{

cadena mensaje = (cadena)obj;

byte[] sendbytes = Encoding.Unicode.GetBytes(mensaje);

IPAddress remotoIp = IPAddress.Parse(tbxSendtoIp.Text);

IPEndPoint remotoIpEndPoint = nuevo IPEndPoint(remoteIp, int.Parse(tbxSendtoport.Text));

sendUdpClient.Send(sendbytes, sendbytes.Length, remotoIpEndPoint)

sendUdpClient.Close(); ;

// Borrar el cuadro de envío de mensaje

ResetMessageText(tbxMessageSend);

}

// Usar un mecanismo de devolución de llamada

// Utilice delegados para implementar operaciones de interfaz entre subprocesos

delegado void ResetMessageCallback(TextBox textbox);

private void ResetMessageText(TextBox textbox)

{

// La propiedad Control.InvokeRequired representa

// Si el procesamiento del control y el hilo de llamada se crean en diferentes hilos, es verdadero, de lo contrario es falso

if (textbox.InvokeRequired)

{

ResetMessageCallback resetMessagecallback = ResetMessageText;

textbox.Invoke(resetMessagecallback, nuevo objeto[] { cuadro de texto }) ;

}

más

{

cuadro de texto.Clear();

cuadro de texto .Focus() ;

}

}

// Dejar de recibir

private void btnStop_Click(remitente del objeto, EventArgs e)

{

recibirUpdClient.Close();

}

// Borrar el cuadro de aceptación de mensaje

privado void btnClear_Click(objeto remitente, EventArgs e)

{

this.lstbxMessageView.Items.Clear()

}

}

>

}