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> 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 p >
// 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()
}
}
>
}