【问题标题】:Receiving packets through TCP通过 TCP 接收数据包
【发布时间】:2012-09-27 14:31:34
【问题描述】:

我想从服务器接收特定的数据包。我正在编写一个从服务器接收数据的程序,我的程序可以在任何 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 是什么?

希望有人能帮忙。

谢谢。

【问题讨论】:

    标签: c# tcp tcplistener


    【解决方案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 字段的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-25
      • 2011-09-09
      • 2013-08-14
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2019-09-19
      相关资源
      最近更新 更多