使用 TCP 套接字接收无效数据

本文关键字:无效 数据 TCP 套接字 使用 | 更新日期: 2023-09-27 17:57:21

这是我向客户端发送数据的服务器端代码:

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 套接字接收无效数据

这就是TCP的工作方式 - 它是一个协议。保证按发送顺序接收字节,但可以一次Receive多个Send操作的数据,也可以在两个Receive内接收一个Send操作的数据。

您必须以某种方式定义消息是什么 - 通常首先发送消息的大小,然后发送消息有效负载。

例如,请参阅示例 http://blog.stephencleary.com/2009/04/message-framing.html - 它包含对原因,方法和代码示例的良好解释。网上还有许多其他例子。