2

ゲームサーバーに rcon コマンドを送信する次の方法があります。

public string sendCommand(string command)
{
byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
byte[] bufferSend = new byte[bufferTemp.Length + 4];

//big enough to receive response
byte[] bufferRec = new byte[65000];

//intial 4 characters as per standard
bufferSend[0] = byte.Parse("255");
bufferSend[1] = byte.Parse("255");
bufferSend[2] = byte.Parse("255");
bufferSend[3] = byte.Parse("255");
int j = 4;

for (int i = 0; i < bufferTemp.Length; i++)
{
    bufferSend[j++] = bufferTemp[i];
}

//send rcon command and get response
try
{
    this.server.Socket.Send(bufferSend, SocketFlags.None);
    this.server.Socket.Receive(bufferRec);
}
catch (SocketException e)
{
    MessageBox.Show(e.ToString(), "Error occured");
}

string response = Encoding.ASCII.GetString(bufferRec);

return response;
}

送信できるすべてのコマンドのうち、そのうちの 1 つは他のコマンドよりも多くのデータを返し、*buffer_rec* バイト配列はメッセージの約 1/4 しか取得できないようですが、その配列は十分な大きさであると宣言されています。すべてのデータが含まれています。後続の 3 つの要求では、何らかの方法でバッファリングされたかのように、残りのデータが出力されます。

なぜこれが起こっているのかわかりません。もしよろしければ、問題を解決する方法を教えていただけないでしょうか。

クローズさんありがとう

4

1 に答える 1

-2

わかりました。これを6時間調べた後、ようやく解決策が思いついたようです。データの受信に小さな変更を加えました。スレッドが10ミリ秒間スリープしていることに注意してください。これは、データグラムを許可するために必要なようです。やがて到着します。

    //send rcon command and get response
    string response = "";
    try
    {
        this.server.Socket.Send(bufferSend, SocketFlags.None);

        do
        {
            int bytesReceived = this.server.Socket.Receive(bufferRec);
            response += Encoding.ASCII.GetString(bufferRec, 0, bytesReceived);
            System.Threading.Thread.Sleep(10);
        } while (this.server.Socket.Available > 0);
    }
    catch (SocketException e)
    {
        MessageBox.Show(e.ToString(), "Error occured");
    }

これを処理するためのより良いまたはよりエレガントな方法があると思う場合は、コードを非難することを躊躇しないでください。しかし、私は常に新しいことを学ぶことができるので、代替手段を提供することによってそうしてください。よろしく、Crouz

于 2012-11-20T14:08:01.393 に答える