C.在System.Sockets中接收数据包的示例

时间:2019-04-18 06:12:47

标签: c# sockets tcp client-server packet

在此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 { }         
}

1 个答案:

答案 0 :(得分:0)

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类,可让您将整数转换为字节[],反之亦然。