C# - 无法从UDP获取服务器响应 - Black Ops Rcon

时间:2010-11-13 23:55:08

标签: c# .net sockets udp

我正在为使命召唤黑色行动创建一个RCON网络应用程序。 COD使用rcon和udp数据包发送和接收信息。使用以下代码,我已经能够使用COD4服务器发送和接收信息。现在COD7已经出来了,我不再收到回复了。

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.Connect(IPAddress.Parse(gameServerIP), gameServerPort);

string command;
command = password + " " + rconCommand;
byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
byte[] bufferSend = new byte[bufferTemp.Length + 5];

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

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

//send rcon command and get response
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
client.Send(bufferSend, SocketFlags.None);

//big enough to receive response
byte[] bufferRec = new byte[65000];
client.Receive(bufferRec);            

有没有人有任何想法? Black Ops附带了自己的Rcon工具,我尝试使用Wireshark来捕获要复制的传出数据包。我的应用程序和他们的应用程序之间的传出数据包是相同的,除了我使用我的时候没有回复。

4 个答案:

答案 0 :(得分:3)

我知道为什么我自己制作工具。

你的代码有什么问题:bufferSend [4] = byte.Parse(“02”);

好的是:bufferSend [4] = byte.Parse(“00”);

尝试一下,适合我!

答案 1 :(得分:1)

这是我的一段代码,我使用一个线程来运行它:

怎么做:

在你的类中设置私有命令,然后调用worker,当线程完成时,只需读取私有响应。

      private IPEndPoint ipendpoint;
      private string command;
      private string response;

      private void worker()
      {
        UdpClient client = new UdpClient();
        var result1 = string.Empty;
        var result2 = string.Empty;
        bool sent = false;
        bool DoubleTrame = false;
        Byte[] bufferTemp = Encoding.ASCII.GetBytes(this.command);
        Byte[] bufferSend = new Byte[bufferTemp.Length + 5];
        Byte[] bufferRec;
        Byte[] bufferRec2;

        bufferSend[0] = Byte.Parse("255");
        bufferSend[1] = Byte.Parse("255");
        bufferSend[2] = Byte.Parse("255");
        bufferSend[3] = Byte.Parse("255");
        bufferSend[4] = Byte.Parse("00");

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

        while (!sent)
        {
            client.Send(bufferSend, bufferSend.Length, ipendpoint);
            Thread.Sleep(200);
            if (client.Available > 0)
            {
                sent = true;
                if (client.Available > 1200)
                {
                    DoubleTrame = true;
                }
            }
        }
        bufferRec = client.Receive(ref ipendpoint);
        if (DoubleTrame)
        {
            bufferRec2 = client.Receive(ref ipendpoint);
            result2 = Encoding.ASCII.GetString(bufferRec2);
            if (result2.Contains("\n\n"))
            {
                result2 = result2.Remove(result2.IndexOf("\n\n"));
            }
            result2 = result2.Substring(12);
        }
        result1 = Encoding.ASCII.GetString(bufferRec);
        this.response = result1 + result2;
      }

答案 2 :(得分:0)

我正在使用vb.net做类似的事情 我已经为COD MW和COD WW编写了rcon工具,但是到目前为止我还没有能够从我的黑色操作服务器获得响应。

答案 3 :(得分:0)

事实上,我已经像你一样完成了saame的事情,我使用WireShark来查看发送和接收的字节,默认的rconTool为Black Ops提供了蒸汽。

其他提示:

命令“status”为您提供有关当前玩家的许多信息,但不提供每个玩家的团队信息。

你最好使用“teamstatus”,这个给你相同的信息,但每个玩家的团队。

我现在很难完全解析回复,但是要给出一个可以接受的答案,请使用:

替换:

    byte[] bufferRec = new byte[65000];
    client.Receive(bufferRec);  

由:

      byte[] bufferRec;
            while (client.Available == 0)
            {
                Thread.Sleep(10);
            }
        client.Receive(bufferRec);  
string response=Encoding.ASCII.GetString(bufferRec);
var list= response.Split('\n');

这样你就会有一个阵列,每个玩家连续分开。

顺便说一句:我是马克,我现在已经注册了,不是这个晚上

编辑:oups,我没注意到你已经尝试过teamstatus命令。

你需要查看client.Avalaible返回的数字,因为服务器一次只发送1168字节,所以如果client.Avalaible&gt; 1168,你需要第二个缓冲区来获取client.receive的第二个流。< / p>

实际上client.avalaible只有两个可能的数字:1168和2336(是的,双)我不知道为什么,但是他们没有设法发送确切的数据,缓冲区总是满的或空。

我还注意到第二个receive()就像在第一个缓冲区上“粘贴”一样。

你将获得第一个Receive()的补充信息,然后是旧的“噪音”。

看看,你会看到我的意思。

我现在在工作,但今晚我会发布我的代码来帮助。