C#-无法从UDP获取服务器响应-黑色操作Rcon

C#-无法从UDP获取服务器响应-黑色操作Rcon,c#,.net,sockets,udp,C#,.net,Sockets,Udp,我正在为使命召唤黑行动创建一个RCON网络应用程序。COD使用rcon和udp数据包发送和接收信息。使用下面的代码,我已经能够通过COD4服务器发送和接收信息。现在代码7已经出来了,我不再收到回复了 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); client.Connect(IPAddress.Parse(gameServerIP), gameServerPo

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

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);            
socketclient=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
client.Connect(IPAddress.Parse(gameServerIP)、gameServerPort);
字符串命令;
命令=密码+“”+rconCommand;
byte[]bufferTemp=Encoding.ASCII.GetBytes(命令);
字节[]bufferSend=新字节[bufferTemp.Length+5];
//根据标准,首字母为5个字符
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;
对于(int i=0;i

有人有什么想法吗?Black Ops自带了自己的Rcon工具,我曾尝试使用Wireshark捕获要复制的传出数据包。我的应用程序和他们的应用程序之间的传出数据包几乎相同,只是我在使用我的应用程序时没有收到回复。

我正在使用vb.net做类似的事情
我已经为COD MW和COD WW编写了rcon工具,没有问题,但是到目前为止,我还无法从我的black ops服务器获得响应。

我不知道为什么我自己制作了一个工具

代码中的错误是:bufferSend[4]=byte.Parse(“02”)

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


试试看,对我有用

事实上,我已经像您一样完成了saame的工作,我使用WireShark查找发送和接收的字节,并使用stream中为Black Ops提供的默认rconTool

其他提示:

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

你最好使用“teamstatus”来代替,这一个给你相同的信息,但是每个玩家的团队都有

我现在很难完全解析响应,但要给出可读的答案,请使用以下命令:

替换:

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

这样,您将拥有一个阵列,每个玩家在一行中分开

顺便说一句:我是麦克,我现在已经注册了,不是今晚吗

编辑:oups,我没有注意到您已经尝试了teamstatus命令

您需要查看client.available返回的数字,因为服务器一次只发送1168字节,所以如果client.available>1168,您需要第二个缓冲区来获取client.receive的第二个流

事实上,client.available只有两个可能的数字:1168和2336(是的,是双精度的)。我不知道为什么,但他们没有成功发送准确数量的数据,缓冲区总是满的或空的

我还注意到第二个receive()类似于第一个缓冲区上的“粘贴”

您将获得第一个Receive()的补充信息,然后是旧接收的“噪声”

只要看一看,你就会明白我的意思


我现在正在工作,但今晚我将发布我的代码以提供帮助。

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

如何做:

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

      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;
      }
专用IPEndPoint IPEndPoint;
私有字符串命令;
私有字符串响应;
私人空房工人()
{
UdpClient client=新的UdpClient();
var result1=string.Empty;
var result2=string.Empty;
bool-sent=false;
bool-DoubleTrame=false;
Byte[]bufferTemp=Encoding.ASCII.GetBytes(this.command);
字节[]bufferSend=新字节[bufferTemp.Length+5];
字节[]bufferRec;
字节[]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”);
对于(int i=0;i0)
{
发送=真;
如果(client.Available>1200)
{
DoubleTrame=true;
}
}
}
bufferRec=client.Receive(参考ipendpoint);
if(双轨电车)
{
bufferRec2=client.Receive(参考ipendpoint);
result2=Encoding.ASCII.GetString(bufferRec2);
if(result2.Contains(“\n\n”))
{
result2=result2.Remove(result2.IndexOf(“\n\n”));
}
结果2=结果2.子串(12);
}
result1=Encoding.ASCII.GetString(bufferRec);
this.response=result1+result2;
}

您是如何发送命令的?他们是否可能在服务器中构建了一些东西,需要在消息中包含特定的文本字符串或其他内容,以便发送回复?只是一些能够识别它是Rcon工具的东西?太棒了!您使用“00”而不是“02”的原因是什么?关于UDP,您是否知道“就是这样做的?”我们的服务器当前为空,但这是我得到的响应。对于COD4,我希望使用映射名称、“表”标题和破折号,但现在我不熟悉底部的字符串。??打印映射:mp_russianbase num score ping guid name team lastmsg address
      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;
      }