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

标签 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 + "' 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();

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();
}

所以,我认为问题在于我尝试在服务器完成发送所有数据之前读取,所以我只能读取部分消息。 如何检查是否有其他数据没有阻塞?

谢谢。

最佳答案

(我正在搜索别的东西,看到了这个问题)

当您将 DataReader.InputOptions 设置为 Partial 时会发生什么?现在 LoadAsync (AFAICT) 不会返回它所有的 BUFFER_SIZE 字节。通过将输入流选项设置为部分,您将获得可用的任何内容。

DataReader 文档是 here和 InputStreamOptions 值为 here

关于c# - UWP,如何从 StreamSocket 读取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34249739/

相关文章:

xaml - ListView ItemTemplate 未填充

websocket - 将 NestJS 连接到 websocket 服务器

c# - Entity Framework 附加/更新混淆(EF Core)

c# - WPF路径动画

c# - 如何按依赖关系对依赖对象进行排序

c# - 如何在 ViewModel 中获取控件的高度

C#:即使在使用 httpclient 发送 CSRF token 后仍获得 403

php - 如何使用 Mozilla CA 证书作为 ssl 客户端证书

php - stream_socket_client 在我的服务器上失败,无法了解有关错误的更多信息

c# - 访问 Xamarin.iOS Settings.Bundle?