C# UWP,如何从StreamSocket读取所有数据

C# UWP,如何从StreamSocket读取所有数据,c#,uwp,stream-socket-client,C#,Uwp,Stream Socket Client,我试图在C#中为UWP实现一个XMPP客户机,为了实现这一点,我使用StreamSocket进行TCP连接 问题是,对于握手和SASL auth,我需要服务器从客户端“写入和读取”一系列数据,并且不能毫不延迟地读取服务器发送的所有数据;我想删除延迟部分 这是我的代码: // Start handshake await XmppWrite("<?xml version='1.0'?><stream:stream to='" + serverHostName.Domain + "'

我试图在C#中为UWP实现一个XMPP客户机,为了实现这一点,我使用
StreamSocket
进行
TCP
连接

问题是,对于握手和SASL auth,我需要服务器从客户端“写入和读取”一系列数据,并且不能毫不延迟地读取服务器发送的所有数据;我想删除延迟部分

这是我的代码:

// 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();
//开始握手
等待XmppWrite(“”);
var responseStream=等待XmppRead();
SaslPlain SaslPlain=新SaslPlain(用户名、密码);
responseStream=null;
字符串xml=null;
而(!saslPlain.IsCompleted&(xml=saslPlain.GetNextXml(responseStream))!=null)
{
等待XmppWrite(xml);
responseStream=等待XmppRead();
}
如果(!saslPlain.issucess)返回;
//请求绑定
等待XmppWrite(“”);
responseStream=等待XmppRead();
//束缚
等待XmppWrite(“”);
responseStream=等待XmppRead();
if(responseStream.Jid==null)返回;
Jid=responseStream.Jid;
//公开会议
等待XmppWrite(“”);
responseStream=等待XmppRead();
XmppRead()方法如下所示:

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();
}
private异步任务XmppRead()
{
等待任务。延迟(100);//如果没有这个,事情就无法进行。。。
var x=wait dataReader.LoadAsync(缓冲区大小);
如果(dataReader.UnsumedBufferLength>0)
{
Debug.WriteLine(x+”,“+dataReader.unsumedbufferlength);
var stream=newxmppstream(dataReader.ReadString(dataReader.unsumedbufferlength));
if(stream.IsError)
{
if(错误!=null)
{
错误(这是新的XmppClientEventArgs(流));
}
抛出新异常(stream.Error);
}
回流;
}
返回新的XmppStream();
}
所以,我认为问题在于我试图在服务器发送完所有数据之前读取,所以我只能读取部分消息。 如何检查是否有其他无块数据

谢谢。

(我在搜索其他内容时看到了这个问题)

将DataReader.InputOptions设置为Partial时会发生什么情况?现在LoadAsync(AFAICT)不会返回,因为它有所有缓冲区大小的字节。通过将输入流选项设置为partial,您将获得任何可用的选项

DataReader文档为,InputStreamOptions值为