=KK=Des_ Опубликовано: 22 октября 2016 Опубликовано: 22 октября 2016 Сердечно приветсвую всех! Давно не ковырялись с сервером и тут решили восстановить работу, но видимо после каких-то изменения и обновлений старые наработки перестали работать. На сервере настройки никакие не меняли. Сейчас Rcon не хочет коннектиться снаружи по айпи и даже не коннектит по внутресетевому адресу "192.168.0.4". Коннект идет только по локалхосту (127.0.0.1). В чем может быть дело? Порты на роутере проброшены. Но даже если бы не было проброса портов почему не коннектит на 192,168,0,4? Есть идеи?
Rizer Опубликовано: 22 октября 2016 Опубликовано: 22 октября 2016 В пределах локалки, работает, только что проверил.
-DED-ASF Опубликовано: 22 октября 2016 Опубликовано: 22 октября 2016 Сейчас Rcon не хочет коннектиться В СДС прописаны настройки ркон?
=KK=Des_ Опубликовано: 22 октября 2016 Автор Опубликовано: 22 октября 2016 В СДС прописаны настройки ркон? Да конечно прописаны. Я же говорю что по адресу 127,0,0,1 коннектит и работает как надо.
-DED-ASF Опубликовано: 22 октября 2016 Опубликовано: 22 октября 2016 (изменено) Да конечно прописаны. Я же говорю что по адресу 127,0,0,1 коннектит и работает как надо. А сделайте плз скриншоты менеджера сдс и в этом менеджере вкладки ркон. Без паролей. Изменено 22 октября 2016 пользователем -DED-ASF
=KK=Des_ Опубликовано: 22 октября 2016 Автор Опубликовано: 22 октября 2016 Сорри! затупил нереально!!!....Настроился. Кто-то в сдс айпи сменил!
-DED-Zlodey Опубликовано: 22 октября 2016 Опубликовано: 22 октября 2016 Так часто, да, бывает. Внимательность наше фсьо!
=KK=Des_ Опубликовано: 22 октября 2016 Автор Опубликовано: 22 октября 2016 Еще по ркон. А отправку сообщений в чат прикрыли? остыл всяких команд работает а вот чат что-то перестал(((
-DED-ASF Опубликовано: 22 октября 2016 Опубликовано: 22 октября 2016 Работает. В том числе и персональные сообщения
72AG_Crusader Опубликовано: 23 октября 2016 Опубликовано: 23 октября 2016 Работает. В том числе и персональные сообщения через румтайп 3 и 36-значный идентификатор пользователя
72AG_Crusader Опубликовано: 23 октября 2016 Опубликовано: 23 октября 2016 Вдруг кому пригодится. Код на питоне и C# для работы с ркон. Python код немного не дописан, но обёртки команд по образцу дописать не сложно. Всё в итоге работает через метод __rcon_send_raw_command (формирование пакета подсмотрено в открытом коде Xedoc'а) C# код писан в том году, работоспособность на тот момент была. Python: import socket # import time class RconCommunicator: """Communicate with IL-2 Battle of Stalingrad dedicated server through Server Remote Console - 'RCon'""" def __init__(self, tcp_ip, tcp_port, buffer_size=1024): self.TCP_IP = tcp_ip self.TCP_PORT = tcp_port self.BUFFER_SIZE = buffer_size self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.SOCKET.settimeout(500) self.CONNECTED = False if self.TCP_IP and self.TCP_PORT: try: self.SOCKET.connect((self.TCP_IP, self.TCP_PORT)) self.CONNECTED = True finally: self.AUTHED = False self.RESPONSE_LIST = [] def __rcon_send_raw_command(self, command='mystatus'): """Sends command 'as is', may cause errors""" if hasattr(self, 'TCP_IP') == False \ or hasattr(self, 'TCP_PORT') == False \ or hasattr(self, 'BUFFER_SIZE') == False \ or hasattr(self, 'SOCKET') == False: raise NameError("RconCommunicator NotInitialized") if type(command) is not str: raise NameError("type(command) is not str") if not self.CONNECTED: return None # формируем пакет cl = len(command) + 1 pack_l = cl.to_bytes(2, byteorder='little') pack_m = command.encode(encoding='utf-8') pack_z = (0).to_bytes(1, byteorder='little') packet = pack_l + pack_m + pack_z # добавить проверку, установлено ли соединение # отправляем пакет try: self.SOCKET.send(packet) except: self.CONNECTED = False return None resp = self.SOCKET.recv(self.BUFFER_SIZE) self.RESPONSE_LIST.append((resp, command)) return str(resp[2:-1], encoding="ascii") def reconnect(self): self.SOCKET.close() self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.SOCKET.settimeout(500) self.CONNECTED = False try: self.SOCKET.connect((self.TCP_IP, self.TCP_PORT)) self.CONNECTED = True finally: self.AUTHED = False def auth(self, user, password): """Authenticate communicator. Gives more permission if true""" if not self.CONNECTED: return False resp = self.__rcon_send_raw_command("auth {0} {1}".format(user, password)) if len(resp): if resp[-1] == "1": self.AUTHED = True return True else: # self.AUTHED = False return False elif type(resp) is bytes and len(resp) == 0: self.AUTHED = True return True else: # self.AUTHED = False return False def server_status(self): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("serverstatus") return resp def player_list(self): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("getplayerlist") return resp def chatmsg(self, roomtype, id, message): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("chatmsg {0} {1} {2}".format(roomtype, id, message)) return resp def private_message(self, account_id, message): if not self.CONNECTED: raise NameError("Not connected") return self.chatmsg(3, account_id, message) def allies_message(self, message): if not self.CONNECTED: raise NameError("Not connected") return self.chatmsg(2, 1, message) def axis_message(self, message): if not self.CONNECTED: raise NameError("Not connected") return self.chatmsg(2, 2, message) def kick(self, name): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("kick name {0}".format(name)) return resp def server_input(self, server_input): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("serverinput {0}".format(server_input)) return resp pass # class C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace IL2RAconnector { public class TcpConnector: IDisposable { TcpClient connection; NetworkStream stream; string host; ushort port; public TcpConnector(string host, ushort port) { // TODO: Complete member initialization this.host = host; this.port = port; connection = new TcpClient(host, (int)port); stream = connection.GetStream(); } public string ExecuteCommand(string command) { Byte[] sendBytes = Encoding.UTF8.GetBytes(String.Concat(command)); Byte[] length = BitConverter.GetBytes((ushort)(command.Length + 1)); Byte[] zero = { 0 }; Byte[] packet = length.Concat(sendBytes).Concat(zero).ToArray(); stream.Write(packet, 0, packet.Length); packet = new Byte[connection.ReceiveBufferSize]; Int32 bytes = stream.Read(packet, 0, packet.Length); UInt16 responseLength = BitConverter.ToUInt16(packet.Take(2).ToArray(), 0); string response = null; if (responseLength > 2) response = Encoding.UTF8.GetString(packet.Skip(2).Take((int)responseLength - 1).ToArray()); //else //throw new Exception(BitConverter.ToString(packet)); return response; } public int RecieveBufferSize { get { return connection.ReceiveBufferSize; } } public void Dispose() { stream.Close(); connection.Close(); } } } namespace IL2RAconnector { public class RconCommunicator { private TcpConnector connection; public Stack<KeyValuePair<StatusCode, string>> History { get; private set; } public StatusCode lastCommandStatus { get; private set; } public string lastCommandResult { get; private set; } public List<Player> Players { get; private set; } public RconCommunicator(string host, ushort port) { connection = new TcpConnector(host, port); History = new Stack<KeyValuePair<StatusCode, string>>(Globals.HistorySize); Players = new List<Player>(); } private void Execute(string cmd) { string response = connection.ExecuteCommand(cmd); string[] arr = { response, "" }; if (response.Contains('&')) { arr = response.Split('&'); } lastCommandStatus = (StatusCode)int.Parse(arr[0].Substring(7)); lastCommandResult = Uri.UnescapeDataString(arr[1]); History.Push(new KeyValuePair<StatusCode, string>(lastCommandStatus, lastCommandResult)); } public string MyStatus() { //cmd: mystatus (no parameters) //response example: STATUS=1&authed=1 string command = "mystatus"; Execute(command); return lastCommandResult; } public string Auth(string user, string password) { //cmd: auth e-mail password //response example: STATUS=1 string command = "auth " + user + " " + password; Execute(command); return lastCommandResult; } public string GetConsole() { //cmd: getconsole //response example: STATUS=1&console= string command = "getconsole"; Execute(command); return lastCommandResult; } public List<Player> GetPlayerList() { //cmd: getplayerlist //response example: STATUS=1&playerList= // playerList isnot defined when there is no players on the server, // or a list of records with a columns: //playerList=cId,profileId,playerId,name,ingameStatus,nServerPing| //enum ingameStatus //{ // PS_SPECTATOR=0, // PS_LOBBY_READY, // PS______NONE___, // PS_DOGFIGHT_READY, // PS_CRAFTSITE_READY //} string command = "getplayerlist"; Execute(command); string[] p = lastCommandResult.Split('|').Skip(1).ToArray(); Players = new List<Player>(p.Count()); foreach(var s in p) { string[] playerInfo = s.Split(','); Players.Add(new Player(int.Parse(playerInfo[0]), playerInfo[1], int.Parse(playerInfo[2]), playerInfo[3], playerInfo[4], playerInfo[5])); } return Players; } public string ServerStatus() { //cmd: serverstatus //response example: STATUS=1 string command = "serverstatus"; Execute(command); return lastCommandResult; } public string Kick(CmdValueType cmdValueType, string value) { //cmd: kick cid/name/playerid/profileid value //response example: STATUS=1 string command = "kick "; switch (cmdValueType) { case CmdValueType.cid: command += "cid "; break; case CmdValueType.name: command += "name "; break; case CmdValueType.playerid: command += "playerid "; break; case CmdValueType.profileid: command += "profileid "; break; } command += value; Execute(command); return lastCommandResult; } public string Ban(CmdValueType cmdValueType, string value) { //cmd: ban cid/name/playerid/profileid value //response example: STATUS=1 string command = "ban "; switch (cmdValueType) { case CmdValueType.cid: command += "cid "; break; case CmdValueType.name: command += "name "; break; case CmdValueType.playerid: command += "playerid "; break; case CmdValueType.profileid: command += "profileid "; break; } command += value; Execute(command); return lastCommandResult; } public string BanUser(CmdValueType cmdValueType, string value) { //cmd: banuser cid/name/playerid/profileid value //response example: STATUS=1 string command = "banuser "; switch (cmdValueType) { case CmdValueType.cid: command += "cid "; break; case CmdValueType.name: command += "name "; break; case CmdValueType.playerid: command += "playerid "; break; case CmdValueType.profileid: command += "profileid "; break; } command += value; Execute(command); return lastCommandResult; } public string UnbanAll() { //cmd: unbanall //response example: STATUS=1 string command = "unbanall"; Execute(command); return lastCommandResult; } public string ServerInput(string translatorName) { //cmd: serverinput translator_name //response example: STATUS=1 string command = "serverinput " + translatorName; Execute(command); return lastCommandResult; } public string SendStatNow() { //cmd: sendstatnow //response example: STATUS=1 string command = "sendstatnow"; Execute(command); return lastCommandResult; } public string CutChatLog() { //cmd: cutchatlog //response example: STATUS=1 string command = "cutchatlog"; Execute(command); return lastCommandResult; } public string ChatMsg(RoomType roomType, string message, int recipientId) { //cmd: chatmsg roomtype id Message to send //response example: STATUS=1 //chatmsg 0 -1 msg (all) //chatmsg 1 cid msg (coalition message, 0 - neutral, 1 - allies, 2 - axis) //chatmsg 2 cid msg (country message, 0 - all) //chatmsg 3 cid msg (private message, cid - client id from playerlist) string command; switch (roomType) { case RoomType.All: command = string.Format("chatmsg 0 -1 {0}", message); break; case RoomType.Coalition: command = string.Format("chatmsg 1 {0} {1}", recipientId, message); break; case RoomType.Country: command = string.Format("chatmsg 2 {0} {1}", recipientId, message); break; case RoomType.ClientId: command = string.Format("chatmsg 3 {0} {1}", recipientId, message); break; default: return string.Empty; } Execute(command); return lastCommandResult; } } } namespace IL2RAconnector { public class Player { public int Cid { get; private set; } public string Name { get; private set; } public string ProfileId { get; private set; } public string PlayerId { get; private set; } public string IngameStatus { get; private set; } public int Ping { get; private set; } public Player(int cid, string ingameStatus, int ping, string unescapedName, string unescapedPlayerId, string unescapedProfileId) { Cid = cid; ProfileId = Uri.UnescapeDataString(unescapedProfileId); PlayerId = Uri.UnescapeDataString(unescapedPlayerId); IngameStatus = ingameStatus; Ping = ping; Name = Uri.UnescapeDataString(unescapedName); } } } 4
ICS_Vortex Опубликовано: 13 июня 2020 Опубликовано: 13 июня 2020 23.10.2016 в 21:32, 72AG_Crusader сказал: Вдруг кому пригодится. Код на питоне и C# для работы с ркон. Python код немного не дописан, но обёртки команд по образцу дописать не сложно. Всё в итоге работает через метод __rcon_send_raw_command (формирование пакета подсмотрено в открытом коде Xedoc'а) C# код писан в том году, работоспособность на тот момент была. Python: Показать содержимое import socket # import time class RconCommunicator: """Communicate with IL-2 Battle of Stalingrad dedicated server through Server Remote Console - 'RCon'""" def __init__(self, tcp_ip, tcp_port, buffer_size=1024): self.TCP_IP = tcp_ip self.TCP_PORT = tcp_port self.BUFFER_SIZE = buffer_size self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.SOCKET.settimeout(500) self.CONNECTED = False if self.TCP_IP and self.TCP_PORT: try: self.SOCKET.connect((self.TCP_IP, self.TCP_PORT)) self.CONNECTED = True finally: self.AUTHED = False self.RESPONSE_LIST = [] def __rcon_send_raw_command(self, command='mystatus'): """Sends command 'as is', may cause errors""" if hasattr(self, 'TCP_IP') == False \ or hasattr(self, 'TCP_PORT') == False \ or hasattr(self, 'BUFFER_SIZE') == False \ or hasattr(self, 'SOCKET') == False: raise NameError("RconCommunicator NotInitialized") if type(command) is not str: raise NameError("type(command) is not str") if not self.CONNECTED: return None # формируем пакет cl = len(command) + 1 pack_l = cl.to_bytes(2, byteorder='little') pack_m = command.encode(encoding='utf-8') pack_z = (0).to_bytes(1, byteorder='little') packet = pack_l + pack_m + pack_z # добавить проверку, установлено ли соединение # отправляем пакет try: self.SOCKET.send(packet) except: self.CONNECTED = False return None resp = self.SOCKET.recv(self.BUFFER_SIZE) self.RESPONSE_LIST.append((resp, command)) return str(resp[2:-1], encoding="ascii") def reconnect(self): self.SOCKET.close() self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.SOCKET.settimeout(500) self.CONNECTED = False try: self.SOCKET.connect((self.TCP_IP, self.TCP_PORT)) self.CONNECTED = True finally: self.AUTHED = False def auth(self, user, password): """Authenticate communicator. Gives more permission if true""" if not self.CONNECTED: return False resp = self.__rcon_send_raw_command("auth {0} {1}".format(user, password)) if len(resp): if resp[-1] == "1": self.AUTHED = True return True else: # self.AUTHED = False return False elif type(resp) is bytes and len(resp) == 0: self.AUTHED = True return True else: # self.AUTHED = False return False def server_status(self): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("serverstatus") return resp def player_list(self): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("getplayerlist") return resp def chatmsg(self, roomtype, id, message): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("chatmsg {0} {1} {2}".format(roomtype, id, message)) return resp def private_message(self, account_id, message): if not self.CONNECTED: raise NameError("Not connected") return self.chatmsg(3, account_id, message) def allies_message(self, message): if not self.CONNECTED: raise NameError("Not connected") return self.chatmsg(2, 1, message) def axis_message(self, message): if not self.CONNECTED: raise NameError("Not connected") return self.chatmsg(2, 2, message) def kick(self, name): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("kick name {0}".format(name)) return resp def server_input(self, server_input): if not self.CONNECTED: raise NameError("Not connected") resp = self.__rcon_send_raw_command("serverinput {0}".format(server_input)) return resp pass # class C# Показать содержимое using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace IL2RAconnector { public class TcpConnector: IDisposable { TcpClient connection; NetworkStream stream; string host; ushort port; public TcpConnector(string host, ushort port) { // TODO: Complete member initialization this.host = host; this.port = port; connection = new TcpClient(host, (int)port); stream = connection.GetStream(); } public string ExecuteCommand(string command) { Byte[] sendBytes = Encoding.UTF8.GetBytes(String.Concat(command)); Byte[] length = BitConverter.GetBytes((ushort)(command.Length + 1)); Byte[] zero = { 0 }; Byte[] packet = length.Concat(sendBytes).Concat(zero).ToArray(); stream.Write(packet, 0, packet.Length); packet = new Byte[connection.ReceiveBufferSize]; Int32 bytes = stream.Read(packet, 0, packet.Length); UInt16 responseLength = BitConverter.ToUInt16(packet.Take(2).ToArray(), 0); string response = null; if (responseLength > 2) response = Encoding.UTF8.GetString(packet.Skip(2).Take((int)responseLength - 1).ToArray()); //else //throw new Exception(BitConverter.ToString(packet)); return response; } public int RecieveBufferSize { get { return connection.ReceiveBufferSize; } } public void Dispose() { stream.Close(); connection.Close(); } } } namespace IL2RAconnector { public class RconCommunicator { private TcpConnector connection; public Stack<KeyValuePair<StatusCode, string>> History { get; private set; } public StatusCode lastCommandStatus { get; private set; } public string lastCommandResult { get; private set; } public List<Player> Players { get; private set; } public RconCommunicator(string host, ushort port) { connection = new TcpConnector(host, port); History = new Stack<KeyValuePair<StatusCode, string>>(Globals.HistorySize); Players = new List<Player>(); } private void Execute(string cmd) { string response = connection.ExecuteCommand(cmd); string[] arr = { response, "" }; if (response.Contains('&')) { arr = response.Split('&'); } lastCommandStatus = (StatusCode)int.Parse(arr[0].Substring(7)); lastCommandResult = Uri.UnescapeDataString(arr[1]); History.Push(new KeyValuePair<StatusCode, string>(lastCommandStatus, lastCommandResult)); } public string MyStatus() { //cmd: mystatus (no parameters) //response example: STATUS=1&authed=1 string command = "mystatus"; Execute(command); return lastCommandResult; } public string Auth(string user, string password) { //cmd: auth e-mail password //response example: STATUS=1 string command = "auth " + user + " " + password; Execute(command); return lastCommandResult; } public string GetConsole() { //cmd: getconsole //response example: STATUS=1&console= string command = "getconsole"; Execute(command); return lastCommandResult; } public List<Player> GetPlayerList() { //cmd: getplayerlist //response example: STATUS=1&playerList= // playerList isnot defined when there is no players on the server, // or a list of records with a columns: //playerList=cId,profileId,playerId,name,ingameStatus,nServerPing| //enum ingameStatus //{ // PS_SPECTATOR=0, // PS_LOBBY_READY, // PS______NONE___, // PS_DOGFIGHT_READY, // PS_CRAFTSITE_READY //} string command = "getplayerlist"; Execute(command); string[] p = lastCommandResult.Split('|').Skip(1).ToArray(); Players = new List<Player>(p.Count()); foreach(var s in p) { string[] playerInfo = s.Split(','); Players.Add(new Player(int.Parse(playerInfo[0]), playerInfo[1], int.Parse(playerInfo[2]), playerInfo[3], playerInfo[4], playerInfo[5])); } return Players; } public string ServerStatus() { //cmd: serverstatus //response example: STATUS=1 string command = "serverstatus"; Execute(command); return lastCommandResult; } public string Kick(CmdValueType cmdValueType, string value) { //cmd: kick cid/name/playerid/profileid value //response example: STATUS=1 string command = "kick "; switch (cmdValueType) { case CmdValueType.cid: command += "cid "; break; case CmdValueType.name: command += "name "; break; case CmdValueType.playerid: command += "playerid "; break; case CmdValueType.profileid: command += "profileid "; break; } command += value; Execute(command); return lastCommandResult; } public string Ban(CmdValueType cmdValueType, string value) { //cmd: ban cid/name/playerid/profileid value //response example: STATUS=1 string command = "ban "; switch (cmdValueType) { case CmdValueType.cid: command += "cid "; break; case CmdValueType.name: command += "name "; break; case CmdValueType.playerid: command += "playerid "; break; case CmdValueType.profileid: command += "profileid "; break; } command += value; Execute(command); return lastCommandResult; } public string BanUser(CmdValueType cmdValueType, string value) { //cmd: banuser cid/name/playerid/profileid value //response example: STATUS=1 string command = "banuser "; switch (cmdValueType) { case CmdValueType.cid: command += "cid "; break; case CmdValueType.name: command += "name "; break; case CmdValueType.playerid: command += "playerid "; break; case CmdValueType.profileid: command += "profileid "; break; } command += value; Execute(command); return lastCommandResult; } public string UnbanAll() { //cmd: unbanall //response example: STATUS=1 string command = "unbanall"; Execute(command); return lastCommandResult; } public string ServerInput(string translatorName) { //cmd: serverinput translator_name //response example: STATUS=1 string command = "serverinput " + translatorName; Execute(command); return lastCommandResult; } public string SendStatNow() { //cmd: sendstatnow //response example: STATUS=1 string command = "sendstatnow"; Execute(command); return lastCommandResult; } public string CutChatLog() { //cmd: cutchatlog //response example: STATUS=1 string command = "cutchatlog"; Execute(command); return lastCommandResult; } public string ChatMsg(RoomType roomType, string message, int recipientId) { //cmd: chatmsg roomtype id Message to send //response example: STATUS=1 //chatmsg 0 -1 msg (all) //chatmsg 1 cid msg (coalition message, 0 - neutral, 1 - allies, 2 - axis) //chatmsg 2 cid msg (country message, 0 - all) //chatmsg 3 cid msg (private message, cid - client id from playerlist) string command; switch (roomType) { case RoomType.All: command = string.Format("chatmsg 0 -1 {0}", message); break; case RoomType.Coalition: command = string.Format("chatmsg 1 {0} {1}", recipientId, message); break; case RoomType.Country: command = string.Format("chatmsg 2 {0} {1}", recipientId, message); break; case RoomType.ClientId: command = string.Format("chatmsg 3 {0} {1}", recipientId, message); break; default: return string.Empty; } Execute(command); return lastCommandResult; } } } namespace IL2RAconnector { public class Player { public int Cid { get; private set; } public string Name { get; private set; } public string ProfileId { get; private set; } public string PlayerId { get; private set; } public string IngameStatus { get; private set; } public int Ping { get; private set; } public Player(int cid, string ingameStatus, int ping, string unescapedName, string unescapedPlayerId, string unescapedProfileId) { Cid = cid; ProfileId = Uri.UnescapeDataString(unescapedProfileId); PlayerId = Uri.UnescapeDataString(unescapedPlayerId); IngameStatus = ingameStatus; Ping = ping; Name = Uri.UnescapeDataString(unescapedName); } } } C# Код не полон . Не хватает констант, или чего там - типа StatusCode - или Globals...
-DED-Zlodey Опубликовано: 13 июня 2020 Опубликовано: 13 июня 2020 2 часа назад, ICS_Vortex сказал: C# Код не полон 1
ICS_Vortex Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 (изменено) Дай бог здоровья тому, кто писал этот RCon... Что за TCP Server там такой кривой блин? Ни с PHP, ни с Java, ни с NodeJS ни с Delphi не работает. Только подключается, но не получает ответа, на Delphi программа вообще залипает на вечно. Неужели в ответе нету '\r\n'? Единственный C# работает...которий я не хочу использовать Изменено 27 июня 2020 пользователем ICS_Vortex
-DED-Zlodey Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 Сдается мне, что дело в TCP Server`e ))
ICS_Vortex Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 Только что, -DED-Zlodey сказал: Сдается мне, что дело в TCP Server`e )) Так вот говорю же, дай бог здоровья тому, кто писал єтот сервер...ужас.
-DED-Zlodey Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 10 минут назад, ICS_Vortex сказал: Так вот говорю же Упс. Я извиняюсь, я там пропустил частицу "не" должно быть так - 16 минут назад, -DED-Zlodey сказал: Сдается мне, что дело НЕ в TCP Server`e ))
ICS_Vortex Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 (изменено) Только что, -DED-Zlodey сказал: Упс. Я извиняюсь, я там пропустил частицу "не" должно быть так - А я не извиняюсь) Там явно дело в сервере. Погуглив - результат - зависание єто причина отсутствия новой строки - символа CRLF. Но да ладно. Я кое какие пробелы кода восстановил. Там в основном то Энумераторы. Но блин. Писать приложение на WinForm - себе дороже, встраивать кнопки в таблицы - тот ещё геморой на C#. А WPF я пока не знаю толком... Прийдется корячить через WFP и Binding...((( Метод хорош, когда ты его знаешь( Изменено 27 июня 2020 пользователем ICS_Vortex
-DED-Zlodey Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 10 минут назад, ICS_Vortex сказал: Там явно дело в сервере. 1. Выше есть код на питоне. Я не проверял, но уверен абсолютно рабочий, так как автор довольно продолжительное время для Рандома писал именно на питоне. 2. Есть такой сервер польский TAW я не уверен, но подозреваю, что там управление реализовано как раз на PHP. 3 C# я убедительно демонстрирую в ролике выше. Похоже на то, что у тебя все хорошо написано, а у того, кто написал RCON не все хорошо, да.
ICS_Vortex Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 Только что, -DED-Zlodey сказал: Похоже на то, что у тебя все хорошо написано, а у того, кто написал RCON не все хорошо, да. Тогда чем обьяснишь факт, что на нескольких языках одна и та же проблема - нету ответа от сервера? Я понимаю, признать факт кривости реализации этого TCP Socket сервера - это сложно. Но да ладно. Я прогнусь. Напишу на C#.
-DED-Zlodey Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 2 минуты назад, ICS_Vortex сказал: Я понимаю, признать факт кривости реализации этого TCP Socket сервера - это сложно. Но да ладно. Я прогнусь. Напишу на C#. Послушай. Не я писал РКОН и ДСервер, я не могу признать кривость реализации так как не эксперт-раз, не видел исходного кода - два. Однако, могу признать работоспособность РКОНа как такового, поскольку на это указывают как минимум три объективные причины приведенные мной выше?, к которым можно добавить еще штатную утилиту. В тоже время, врываешься ты, не показываешь свой код, не показываешь запросы, на которые не отвечает сервер, и объявляешь в криворукости разработчиков. На что это похоже? Как минимум на хамство, как максимум на скупость ума. Думаю, тебе придется самостоятельно в дальнейшем разбираться, так как в таком тоне с тобой вряд ли кто пойдет на диалог с целью оказания информационной помощи. Это к тому, что пиши на чем угодно, прогибайся, выпрямляйся - всем насрать.
ICS_Vortex Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 Только что, -DED-Zlodey сказал: Послушай. Не я писал РКОН и ДСервер, я не могу признать кривость реализации так как не эксперт-раз, не видел исходного кода - два. Однако, могу признать работоспособность РКОНа как такового, поскольку на это указывают как минимум три объективные причины приведенные мной выше?, к которым можно добавить еще штатную утилиту. В тоже время, врываешься ты, не показываешь свой код, не показываешь запросы, на которые не отвечает сервер, и объявляешь в криворукости разработчиков. На что это похоже? Как минимум на хамство, как максимум на скупость ума. Думаю, тебе придется самостоятельно в дальнейшем разбираться, так как в таком тоне с тобой вряд ли кто пойдет на диалог с целью оказания информационной помощи. Это к тому, что пиши на чем угодно, прогибайся, выпрямляйся - всем насрать. Больно уж надо. Буд-то до этого кто-то сильно помог... 1
Valdamar Опубликовано: 27 июня 2020 Опубликовано: 27 июня 2020 4 часа назад, -DED-Zlodey сказал: Я не проверял, но уверен абсолютно рабочий, так как автор довольно продолжительное время для Рандома писал именно на питоне. Даже я смог разробраться, рабочий. Спасибо Максу, кстати! 2
ICS_Vortex Опубликовано: 19 июля 2020 Опубликовано: 19 июля 2020 (изменено) Вот пример. При чем, коннектится к серверу - а ответа от сервера - никакого...что б не слал на сервер... var net = require('net'); var client = new net.Socket(); client.connect(1337, '127.0.0.1', function() { console.log('Connected'); client.write('Hello, server! Love, Client.'); }); client.on('data', function(data) { console.log('Received: ' + data); client.destroy(); // kill client after server's response }); client.on('close', function() { console.log('Connection closed'); }); Изменено 19 июля 2020 пользователем ICS_Vortex
ICS_Vortex Опубликовано: 23 июля 2020 Опубликовано: 23 июля 2020 (изменено) Шо, все "специалисты" вымерли? Это все? Полномочия окончены? Быстро... Ладно, попытка #2. Какая разница между командами ban и banuser? Изменено 23 июля 2020 пользователем ICS_Vortex 1
1CGS -DED-Rapidus Опубликовано: 9 августа 2020 1CGS Опубликовано: 9 августа 2020 @ICS_Vortex,Пока никакой, обе команды выдают бан на 15 минут.
ICS_Vortex Опубликовано: 18 августа 2020 Опубликовано: 18 августа 2020 09.08.2020 в 18:42, -DED-Rapidus сказал: @ICS_Vortex,Пока никакой, обе команды выдают бан на 15 минут. Спасибо за ответ. Я так понимаю, что перманентного бана в RCON API нету? Будет ли?
1CGS -DED-Rapidus Опубликовано: 19 августа 2020 1CGS Опубликовано: 19 августа 2020 Нету, будет или нет пока не могу сказать точно.
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас