簡體   English   中英

沒有看到通過TCP收到的所有數據

[英]Not seeing all data received through TCP

我正在嘗試使用用作TCP客戶端的套接字接收數據,但是某種程度上,並非WireShark中顯示的所有數據在我的代碼中都可用。

使用WireShark,我可以看到傳入的數據包,並且測試工具(不是我自己制造的)以我期望的方式顯示數據。

在下面的示例中,當我打印recData的長度時,它與數據的長度相關聯,如WireShark所示,因此到目前為止,一切似乎都還不錯。

但是,當我想將接收到的消息顯示為可讀字符串(UTF-8編碼的XML)時,我只能看到我期望的部分消息。

我使用的Socket

            private Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private byte[] _recieveBuffer = new byte[1024];

        public void Connect()
        {
            try
            {
                sock.Connect(new IPEndPoint(IPAddress.Parse(this.IpAddress), this.Port));
                sock.ReceiveBufferSize = _recieveBuffer.Length;
            }
            catch (Exception ex)
            { }

            sock.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);

        }

        private void ReceiveCallback(IAsyncResult ar)
        {
            int received = sock.EndReceive(ar);

            if (received <= 0)
                return;

            byte[] recData = new byte[received];
            Buffer.BlockCopy(_recieveBuffer, 0, recData, 0, received);

            if (onDataReceived != null)
                onDataReceived(this, new MyNewEventargs(recData));

            Console.WriteLine(Encoding.UTF8.GetString(recData));

            sock.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);                
        }

我收到的數據包: 在此處輸入圖片說明

我注意到的是,第二個收到的包裹(圖像中突出顯示的那個)大約是第一個包裹的兩倍。

當查看軟件包的內容時,可以看到第一個包含1個完整的XML項,第二個包含2個。

但是,當我將第二個包的內容打印為字符串時,我仍然只看到一個XML項,因此第三個丟失。

我期望的完整XML消息如下所示:

<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="First item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
    <Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="Second item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
    <Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="Third item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
    <Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>

控制台顯示的XML消息如下所示:

//First package
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="First item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
    <Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>

//First item of second package
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="Second item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
    <Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>

如您所見,第三個XML項丟失了。

我嘗試弄亂線程和秒表,看是否是時間問題,但是由於接收到的包的大小正確,所以我認為這不是我的問題的原因。

當我將收到的byte[]打印到控制台時,我還沒有進行任何反序列化。

如何獲得此套接字以接收(或讓我看到)所有發送的數據?


編輯:

經過更多的調試后,我發現確實可以獲取所有數據,但是我認為Encoding.UTF8.GetString(recData)出了點問題。

第二次調用ReceiveCallback ,接收的字節數為446,而不是221。數據被復制到byte [] recData ,並且確實包含446個字節。 當我在此行上設置斷點並將received到的int手動更改為221時(因此它將僅將第一項復制到byte []),我得到的結果與停留在446時的結果相同。

因此,我確實獲得了所有數據,但不知何故它無法解碼為我期望的字符串。

希望這有道理..

您的“ onDataReceived”在做什么? 有什么可能影響您的邏輯嗎?

您的代碼在這里可以正常工作(至少使用通用HTML進行測試),除了上面提到的事件處理程序之外,所有字節均已接收並顯示。

(注意:不能發表評論,這就是為什么我要發表回復。隨時刪除。)

C。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM