2012-10-06 38 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字段的內容。