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

Identification フィールドをいじりたい場合は、標準の TCP を使用していません。アプリケーションには、TCP 接続がストリームとして提示されます。基本パケットにアクセスできません。さらに、標準の TCP 接続では、識別フィールドはランダムな 16 ビット フィールドです。0x0d はこの幅を埋めず、一定ではない可能性が高いです。ただし、この種のシナリオが必要になる他のいくつかのシナリオを想像できます。

まず、パケット ベースのプロトコルを使用する場合は、UDP を試してください。UdpClient クラス (http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx) を使用すると、単一のデータグラムを受信して​​操作できます。

第 2 に、実際に TCP を使用していて、何らかの理由で ID 0x000d のパケットを取得する必要がある場合は、スタックのはるかに低い位置に座る必要があります。Winsock は RAW ソケット (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx) を介してこれを公開しますが、XP および超えて。

第 3 に、PacketID と呼ばれるフィールドを持つアプリケーション定義のパケットを探している場合、TCP に重ねられたパケット プロトコルが表示されます。ほとんどの場合、定数値を持つ StartOfPacket バイトと EndOfPacket バイトが存在します。ただし、ストリームをパケット化する方法は他にもたくさんあります。ストリームを解析する適切な方法を決定するには、サーバーの実装を確認する必要があります。いずれにせよ、TcpListener、TcpClient、または Socket のいずれかを使用して、ストリームの読み取りをバッファにループする必要があります。各読み取りの後、バッファをスキャンして有効なパケットを探し、それを処理します。その時点で、パケットへのオフセットに基づいて PacketID フィールドの内容を確認できます。

于 2012-10-06T19:57:17.967 に答える