strip_tags remove quitar para funcion etiquetas ejemplo string multithreading asynchronous udp beginreceive

string - remove - strip_tags wordpress



No se puede agregar a la cadena recibida en el Oyente UDP C# (1)

Tengo un Formulario que crea un objeto UDP, en la clase UDP se crea un Cliente UDP y los datos recibidos se hacen en el Método BeginReceive usando EndReceive.

Cuando imprimo la cadena de los datos revelados, después de convertir el byte [], a la consola desde el método beginreceive, con el texto adjunto, solo los datos recibidos imprimen no el texto adjunto.

Entonces parece que los datos recibidos están incompletos.

Cuando se imprime la cadena, no se muestra NewLine y se agrega "hecho".

¡Cualquier ayuda sería genial!

Gracias

class Udp { public EventHandler _dataReceived; public Udp() { int receiverPort = 1248; UdpClient receiver = new UdpClient(receiverPort); string discovery = "<?xml version=/"1.0/"?><ServiceQuery></ServiceQuery>"; receiver.BeginReceive(new AsyncCallback( DataReceived), receiver); IPEndPoint end = new IPEndPoint(IPAddress.Broadcast, 1248); receiver.Send(Encoding.ASCII.GetBytes(discovery + "/0"), discovery.Length + 1, end); } private void DataReceived(IAsyncResult ar) { UdpClient c = (UdpClient)ar.AsyncState; IPEndPoint receivedIpEndPoint = new IPEndPoint(IPAddress.Any, 1248); Byte[] receivedBytes = c.EndReceive(ar, ref receivedIpEndPoint); string receivedText = ASCIIEncoding.ASCII.GetString(receivedBytes); Console.WriteLine("/n"); if(_dataReceived != null) { Console.Write(receivedIpEndPoint + ": " + receivedText + Environment.NewLine + "done"); _dataReceived(receivedText, new EventArgs()); } c.BeginReceive(new AsyncCallback(DataReceived), c); } }


La reproducción más simple que se me ocurre para este problema es este código:

private void button1_Click(object sender, EventArgs e) { Byte[] receivedBytes = new byte[] { 0x48, 0x65, 0x6c, 0x00, 0x6c, 0x6f }; string receivedText = Encoding.ASCII.GetString(receivedBytes); Console.Write(receivedText + ", you won''t see this"); }

Salida después de hacer clic en el botón varias veces:

HelHelHelHel

Seguramente ahora reconoces la píldora venenosa en la matriz receivedBytes , es la presencia del byte 0x00 la que hace que la cadena de salida se acorte. Nada más allá de ese byte lo convierte en la ventana Visual Studio Output.

Explicar este comportamiento requiere una inmersión bastante profunda en cómo funciona Console.Write () en una aplicación Winforms y cómo es capaz de generar resultados, incluso si su programa no tiene consola. Es una historia interminable que no es probable que entretenga a nadie, así que voy a punt para la versión corta. Con la opción del depurador de Visual Studio Hosting Process habilitada, Console.Write () es equivalente a Debug.Write (). El resultado de depuración es interceptado por la clase DefaultTraceListener, identifica a OutputDebugString () para que el texto aparezca en la ventana de seguimiento del depurador. Estas funciones winapi toman cadenas C, una cadena C termina en cero para indicar el final de la cadena.

Hay varias formas de arreglar esto, la forma del programador es convertir el contenido del array byte [] a hexadecimal:

Byte[] receivedBytes = new byte[] { 0x48, 0x65, 0x6c, 0x00, 0x6c, 0x6f }; string receivedText = BitConverter.ToString(receivedBytes); Console.WriteLine(receivedText + ", you see this");

Salida:

48-65-6C-00-6C-6F, you see this 48-65-6C-00-6C-6F, you see this 48-65-6C-00-6C-6F, you see this

O tal vez desee examinar mejor los datos que transmite, asegurándose de que se trata de texto imprimible que se puede convertir correctamente con Encoding.ASCII