WinRT上的StreamSocket不接收所有数据

时间:2015-03-12 21:45:23

标签: c# .net sockets windows-runtime datareader

我是运行MPD(音乐播放器守护程序)的服务器,它通过套接字进行通信。现在我试图在Windows商店应用程序中实现MPD协议。基本上我发送一个命令并收到一个列表,其中包含最后一行" OK"。只要接收列表小于接收缓冲区,一切都可以。但是如果我需要加载大于缓冲区的数据,那么有线的东西就会开始。

第一次仅收到部分数据时调用SendCommand,第二次调用SendCommand时会收到其余数据。再次调用时,我会按预期接收所有数据。在同一台机器上的WPF程序中执行此操作时,一切都很好。

这是我的代码:

    public async Task<string> SendCommand(MpdProtocol.MpdCommand command)
    {
        DataWriter writer = new DataWriter(streamSocket.OutputStream);
        string res = string.Empty;

        writer.WriteString(command.ToString());
        await writer.StoreAsync();
        res = await ReadResponse();

        writer.DetachBuffer();
        writer.DetachStream();
        return res;
    }

    private async Task<string> ReadResponse()
    {
        DataReader reader = new DataReader(streamSocket.InputStream);
        reader.InputStreamOptions = InputStreamOptions.Partial;
        StringBuilder response = new StringBuilder();

        const uint MAX_BUFFER = 8 * 1024;
        uint returnBuffer = 0;
        do
        {
            returnBuffer = await reader.LoadAsync(MAX_BUFFER);
            response.Append(reader.ReadString(reader.UnconsumedBufferLength));

        } while (returnBuffer >= MAX_BUFFER);

        reader.DetachBuffer();
        reader.DetachStream();

        return response.ToString();
    }

我使用了ReadResponse方法,但没有任何效果。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

最后,我找到了一个解决方案来使通信工作:用reader.ReadByte()逐字节读取流并检查每个接收到的行(它们由"\n"分隔)是否为& #34; OK&#34 ;.

问题是reader.ReadString。当你知道字符串是多久你会尝试接收时,这种方法很好。在我的情况下,我不知道字符串的大小。我所知道的是,最后一行将是&#34; OK&#34;串。

我的错误是相信 - 正如彼得提到的那样 - 只要有数据来反转recive缓冲区将被完全填充,只有最后一次调用reader.ReadString将小于最大缓冲区大小。我还试图以不同的方式重写ReadResponse函数,但对reader.ReadString没有任何效果。