0

我有一个特定的数据包,我想从服务器接收。我正在编写一个从服务器接收数据的程序,我的程序可以在任何 PC 上使用——作为客户端。

服务器发送的数据包内容:

1) 数据包 ID - 字节

2) 玩家 ID - SByte

3) 消息 - 字符串

数据包 ID 为 0x0d。

我查看了 TCPListener 示例,但我真的不确定如何自定义它来专门处理这个数据包。如果它有帮助,我的客户端在接收任何这样的数据包之前就已经连接到服务器:

        ConnectionSocket = new Socket(AddressFamily.InterNetwork,
               SocketType.Stream, ProtocolType.Tcp);

        IEP = new IPEndPoint(IPAddress.Any, port);
        ConnectionSocket.Connect(serverAddress, port);

如果这对 TCPListener 有帮助,我会知道服务器的端口和 IP 是什么?

我希望有人能帮忙。

谢谢。

4

1 回答 1

1

如果您想弄乱标识字段,则说明您没有使用标准 TCP。对于应用程序,TCP 连接被呈现为流。您无权访问基本数据包。此外,在标准 TCP 连接中,标识字段是一个随机的 16 位字段。0x0d 不会填充此宽度,并且很可能不会是恒定的。但是,我可以想象其他几种您需要这种情况的情况。

首先,如果您希望使用基于数据包的协议,请尝试使用 UDP。UdpClient 类 (http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx) 将允许您接收单个数据报,然后您可以对其进行操作。

其次,如果您实际上正在使用 TCP,并且出于某种原因确实需要获取标识为 0x000d 的数据包,那么您需要在堆栈上坐得更低。Winsock 通过 RAW 套接字 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx) 公开了这一点,但似乎 XP 和超过。

第三,如果您正在寻找一个应用程序定义的数据包,其中包含一个名为 PacketID 的字段,则会在 TCP 上叠加一个数据包协议。在所有可能的情况下,都会有一个具有恒定值的 StartOfPacket 字节和一个 EndOfPacket 字节。但是,还有一千种其他方法可以对流进行打包,您必须检查服务器实现以确定解析流的正确方法。在任何情况下,使用 TcpListener、TcpClient 或 Socket,您都需要循环读取流到缓冲区中。每次读取后,扫描缓冲区以查找有效数据包,并对其进行处理。此时,您可以根据数据包的偏移量检查 PacketID 字段的内容。

于 2012-10-06T19:57:17.967 回答