通过TCP接收数据包

时间:2012-10-06 19:32:15

标签: c# tcp tcplistener

我想从服务器接收一个特定的数据包。我正在编程一个程序,它将从服务器接收数据,我的程序可以在任何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);

我知道服务器的端口和IP是什么,如果这应该有助于TCPListener?

我希望有人可以提供帮助。

感谢。

1 个答案:

答案 0 :(得分: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字段的内容。