我正在为使命召唤黑色行动创建一个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来捕获要复制的传出数据包。我的应用程序和他们的应用程序之间的传出数据包是相同的,除了我使用我的时候没有回复。
答案 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()的补充信息,然后是旧的“噪音”。
看看,你会看到我的意思。
我现在在工作,但今晚我会发布我的代码来帮助。