【问题标题】:C# Receiving Packet in System.Sockets with examplesC# 在 System.Sockets 中接收数据包及示例
【发布时间】:2019-09-08 10:29:46
【问题描述】:

在这个问题中C# Receiving Packet in System.Sockets 一个人问: “在我的客户端服务器应用程序中,我想知道如何制作一个数据包并通过客户端将其发送到服务器 然后在服务器上我识别出这是哪个数据包并发送正确的重播”

并展示了他实现“数据包识别器”的方式的示例。他得到了一个答案,他的“构造消息”的方式很糟糕,但答案后面没有解释和代码示例。

所以请,任何人都可以展示一个好的代码的例子,它应该做这样的事情,但正确的方式:

[客户]

Send(Encoding.ASCII.GetBytes("1001:UN=user123&PW=123456")) //1001 is the ID

[服务器]

private void OnReceivePacket(byte[] arg1, Wrapper Client)
{
    try
    {
        int ID;
        string V = Encoding.ASCII.GetString(arg1).Split(':')[0];
        int.TryParse(V, out ID);

        switch (ID)
        {
            case 1001://Login Packet
                AppendToRichEditControl("LOGIN PACKET RECEIVED");
                break;

            case 1002:
                //OTHER IDs
                break;

            default:
                break;
        }
    }
    catch { }         
}

【问题讨论】:

    标签: c# sockets tcp client-server packet


    【解决方案1】:

    TCP 确保数据按照发送的顺序到达 - 但它没有消息的概念。例如,假设您发送以下两个数据片段:

    1001:UN=user123&PW=123456
    999:UN=user456&PW=1234
    

    在接收端,您将读取1001:UN=user123&PW=123456999:UN=user456&PW=1234,这可能需要读取一次、两次或更多次。这甚至可能以两个数据包的形式到达:

    1001:UN=user123&PW=12
    3456999:UN=user456&PW=1234
    

    这使得必须正确解析消息。另一篇文章提到在实际数据之前发送数据包的长度,这确实解决了问题,因为您可以准确确定一条消息何时结束,下一条消息何时开始。

    例如,客户端和服务器可以同意每条消息以包含消息长度的 4 个字节开始。然后接收者可以简单地:

    • 准确加载 4 个字节
    • 转换为整数,现在您知道消息剩余部分的长度了
    • 准确读取那么多字节并解析消息

    C# 有一个方便的BitConverter 类,允许您将整数转换为字节[],反之亦然。

    【讨论】:

    • 好吧,但是我如何告诉服务器我正在发送长度,而不是数据。我越来越糊涂了
    • 长度是数据的一部分——重要的部分是长度先发送,并且是固定大小。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多