0

TCP/IP 経由で医療機器に接続するクライアントを作成しました。そのマシンは、内部でトリガーされたイベントに基づいて XML ファイルを送信してくれます。これらの XML をキャッチして、ファイル システムに保存する必要があります。非同期接続を提供するクラスを使用し、いくつかのことを除いて正常に動作します。書き込まれたファイルを確認すると、null 値 (0X00 としてコード化) で区切られた 2 つの xml が含まれていることに気付きました。そのため、バッファーに一種のフィルターを配置しましたが、問題は残ります。基本的に、XML ファイルの終わりを検出したら、バッファーをブレークする必要があります。

これは、非同期読み取りを提供するコードです。

try
{
    NetworkStream networkStream = this.client.GetStream();                
    int read = networkStream.EndRead(asyncResult);

    if (read == 0)
    {
        if (this.Disconnected != null)
            this.Disconnected(this, new EventArgs());
    }

    byte[] buffer = asyncResult.AsyncState as byte[];
    if (buffer != null)
    {
        byte[] data = new byte[read];
        Buffer.BlockCopy(buffer, 0, data, 0, read);
        networkStream.BeginRead(buffer, 0, buffer.Length, this.ClientReadCallback, buffer);
        content.Append(Encoding.UTF8.GetString(buffer.TakeWhile((b, index) => index <= read).Where(b => b != 0x00).ToArray()));

        // Store the file
        string machineId = StoreFile(content.ToString());

        counter++;
        if (this.DataRead != null)
            this.DataRead(this, new DataReadEventArgs(data));
    }
}
catch (Exception ex)
{
    Logger.Log(ex.Message);
    if (this.ClientReadException != null)
        this.ClientReadException(this, new ExceptionEventArgs(ex));
}
4

1 に答える 1

1

問題は、2 番目の XML 文書の先頭を切り取っていますが、読み取りを続行していることです。次の読み取りには 0 がないため、その内容を書き込みます。

Read: XML1
Read: XML1 \0 XML2 <-- you cut this XML2 off
Read: XML2 <-- but then continue reading here.
于 2012-12-17T16:48:13.830 に答える