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.