c# uwp stream-socket-client

c# - UWP, cómo leer TODOS los datos de StreamSocket



stream-socket-client (0)

Estoy intentando implementar un cliente XMPP para UWP en C # y para lograr esto estoy usando StreamSocket para la conexión TCP .

El problema es que para handshake y SASL auth necesito una secuencia de "escritura y lectura" del cliente por parte del servidor y sin demora no puedo leer todos los datos enviados por el servidor; Quiero eliminar la parte de retraso.

Este es mi código:

// Start handshake await XmppWrite("<?xml version=''1.0''?><stream:stream to=''" + serverHostName.Domain + "'' xmlns=''jabber:client'' xmlns:stream=''http://etherx.jabber.org/streams'' version=''1.0''>"); var responseStream = await XmppRead(); SaslPlain saslPlain = new SaslPlain(Username, Password); responseStream = null; String xml = null; while (!saslPlain.IsCompleted && (xml = saslPlain.GetNextXml(responseStream)) != null) { await XmppWrite(xml); responseStream = await XmppRead(); } if (!saslPlain.IsSuccess) return; // Request bind await XmppWrite("<?xml version=''1.0''?><stream:stream to=''" + serverHostName.Domain + "'' xmlns=''jabber:client'' xmlns:stream=''http://etherx.jabber.org/streams'' version=''1.0''>"); responseStream = await XmppRead(); // Bind await XmppWrite("<iq id=''" + GenerateId() + "'' type=''set''><bind xmlns=''urn:ietf:params:xml:ns:xmpp-bind''/></iq>"); responseStream = await XmppRead(); if (responseStream.Jid == null) return; Jid = responseStream.Jid; // Open session await XmppWrite("<iq id=''" + GenerateId() + "'' type=''set''><session xmlns=''urn:ietf:params:xml:ns:xmpp-session''/></iq>"); responseStream = await XmppRead();

El método XmppRead () es este:

private async Task<XmppStream> XmppRead() { await Task.Delay(100); // Things don''t works without this... var x = await dataReader.LoadAsync(BUFFER_SIZE); if (dataReader.UnconsumedBufferLength > 0) { Debug.WriteLine(x + ", " + dataReader.UnconsumedBufferLength); var stream = new XmppStream(dataReader.ReadString(dataReader.UnconsumedBufferLength)); if (stream.IsError) { if (Error != null) { Error(this, new XmppClientEventArgs(stream)); } throw new Exception(stream.Error); } return stream; } return new XmppStream(); }

Entonces, creo que el problema es que trato de leer antes de que el servidor haya terminado de enviar todos sus datos, por lo que puedo leer solo un mensaje parcial. ¿Cómo puedo verificar si hay algún otro dato sin bloque?

Gracias.