2

サーバーの受信パケットを処理するためのコードのほとんどを作成しました。パケットのフォーマットは常に int/int/int/string/string で、最初の int はパケットのサイズです。パケット全体が到着したかどうか、またはさらにピースが到着するのを待つ必要があるかどうかを確認する方法を見つける必要がありますが、コードを書いた方法では良い方法が思いつきません。私の脳はおそらくこれを考えすぎているので、どんな助けも素晴らしいでしょう.

private void ReadClientPacket(object client)
{
    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();

    while (true)
    {
        try
        {
            int packetsize;

            // Create a new Packet Object and fill out the data from the incoming TCP Packets
            RCONPacket packet = new RCONPacket();

            using (BinaryReader reader = new BinaryReader(clientStream))
            {
                // First Int32 is Packet Size
                packetsize = reader.ReadInt32();

                packet.RequestId = reader.ReadInt32();
                packet.ServerDataSent = (RCONPacket.SERVERDATA_sent)reader.ReadInt32();

                Console.WriteLine("Packet Size: {0} RequestID: {1} ServerData: {2}", packetsize, packet.RequestId, packet.ServerDataSent);

                // Read first and second String in the Packet (UTF8 Null Terminated)
                packet.String1 = ReadBytesString(reader);
                packet.String2 = ReadBytesString(reader);

                Console.WriteLine("String1: {0} String2: {1}", packet.String1, packet.String2);
            }

            switch (packet.ServerDataSent)
            {
                case RCONPacket.SERVERDATA_sent.SERVERDATA_AUTH:
                {
                    ReplyAuthRequest(packet.RequestId, clientStream);
                    break;
                }
                case RCONPacket.SERVERDATA_sent.SERVERDATA_EXECCOMMAND:
                {
                    ReplyExecCommand();
                    break;
                }
                default:
                {
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            break;
        }
    }

    tcpClient.Close();
}
4

1 に答える 1

1

基になるストリームはより多くのデータを待機するため、必要なものは機能するはずです。つまり、呼び出したときにclientStream.ReadByte使用可能なバイトがない場合、メソッドはデータが着信するまで、またはストリームが閉じられるまで(この場合はサーバーによって切断される可能性があります)ブロックされます。

BinaryReader読み取り要求を満たすのに十分なデータが得られるまで実行されるため、コードは期待どおりに機能するはずです。

于 2011-03-13T15:22:31.657 に答える