2012-10-06 36 views
0

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

分组的内容由服务器发送:

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

如果您正在寻找与标识字段混在一起,您没有使用标准的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字段的内容。