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

标签 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 { }         
}

最佳答案

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 类,允许您将整数转换为 byte[],反之亦然。

关于C# 在 System.Sockets 中接收数据包示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55740035/

相关文章:

c# - 如何使用 MSpec 有效地测试固定长度的平面文件解析器?

c# - Open XML SDK - AddImagePart - 将图像位置从/media 更改为/word/media

python - 使用QLineEdit.setText()可以卡住窗口,但是后台任务可以正常工作

java - (Java, Socket) BufferedReader 阻塞线程,无法 .close()

c - TCP 服务器 - 从 "Too many open files"恢复

c# - 为什么我不能在 XAML 中定义 ResourceDictionary 并自行实例化它?

c# - 如何为有限的代码部分使用命名空间

c++ - Boost Socket 在 close() 上崩溃

http - HTTP 下载到底是什么意思?

java - WCF 可以使用 TCP 上的 SOAP 并由 java 客户端使用吗