簡體   English   中英

使用TCP套接字接收無效數據

[英]Receive invalid data with TCP socket

這是我的服務器端代碼,用於向客戶端發送數據:

public bool SendMessage(Socket socket, byte[] message, string logMessage = "Unknow")
    {
        try
        {
            MsgTemp msg = new MsgTemp(socket, logMessage, message);

            System.Diagnostics.Trace.WriteLine(" send ---------- " + message.Length.ToString());

            socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallBack), msg /* null*/);
            return true;
        }
        catch
        {
            // :) removed
        }
        return false;
    }

並且此代碼是客戶端中的接收回調方法:

private void ReceiverCallBack(IAsyncResult ar)
    {
        try
        {
            int size = _socket.EndReceive(ar);
            _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiverCallBack), null);

            System.Diagnostics.Trace.WriteLine(" received ---------- " + size.ToString());

            // messagereceived is an event
            if (MessageReceived != null)
            {
                byte[] temp = new byte[size];
                Array.Copy(_buffer, temp, size);

                MessageReceived(temp);
            }
        }
        catch (Exception exp)
        {
            // :) removed
        }

    }

當服務器向客戶端發送許多數據包時無效。 (在正常/低交易中正常工作)

看到此信息(在會話中服務器與客戶端之間發送字節):

send ---------- 496 
received ---------- 496
send ---------- 613
received ---------- 613
send ---------- 680
received ---------- 680
send ---------- 227
send ---------- 697
received ---------- 227
send ---------- 722
send ---------- 710
received ---------- 697
received ---------- 1432

最后兩個軟件包被發送到一個軟件包中接收到的客戶端-> 722 + 710 = 1432,數據變為無效/不可用...

為什么呢? 謝謝

這就是TCP的工作方式-它是協議。 保證字節的發送順序完全相同,但是您可以一次Receive多個Send操作的數據,也可以在兩個Receive一個Send操作的數據。

您必須以某種方式定義消息是什么-通常首先發送消息的大小,然后發送消息有效負載。

參見例如http://blog.stephencleary.com/2009/04/message-framing.html-它很好地解釋了為什么,如何和代碼示例。 在線上還有許多其他示例。

暫無
暫無

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

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