Thejuster Posted October 28, 2018 Posted October 28, 2018 Hello i try to make a discord bot whit potential feature. One my problem is try to connection in rAthena Server. Actually i use c# my code //Setting Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint host = new IPEndPoint(ip, 6900); soc.Connect(host); //Static Packet byte packet = 0x64; byte[] id = Encoding.ASCII.GetBytes("Thejuster"); byte[] pass = Encoding.ASCII.GetBytes("123456789"); //Packet Builder List<byte> pacchetto = new List<byte>(); //Assembly packet pacchetto.Add(0x64); foreach(byte b in id) { pacchetto.Add(b); } foreach(byte b in pass) { pacchetto.Add(b); } //Send full pachet soc.Send(pacchetto.ToArray()); When i try to connect, rAthena Login Server say this: anyone know reason of this problem? Quote
1 Zell Posted October 31, 2018 Posted October 31, 2018 See if this helps you https://stackoverflow.com/questions/11969993/how-send-data-tcp-in-binary-frame-format 1 Quote
1 Secrets Posted November 16, 2018 Posted November 16, 2018 (edited) Structure padding screwed you up there edit: Add Pack = 1 to the StructLayout attribute and change version to uint since ulong is 64 bit integer (8 bytes) Edited November 16, 2018 by Secrets Quote
0 jchcc Posted October 28, 2018 Posted October 28, 2018 https://github.com/rathena/rathena/blob/master/src/login/loginclif.cpp#L273 0064 <version>.L <username>.24B <password>.24B <clienttype>.B Quote
0 Thejuster Posted October 31, 2018 Author Posted October 31, 2018 (edited) Tanks jchcc i miss Last param hehe . Clienttype But one question. .L .24b .B is? Edited October 31, 2018 by Thejuster Quote
0 Secrets Posted October 31, 2018 Posted October 31, 2018 The packet ID (0x64) should be a ushort instead of byte. Quote
0 Thejuster Posted November 4, 2018 Author Posted November 4, 2018 (edited) Tanks Zell i try whit this example. First step is done but server cant read my username or password send in src/loginclif.cpp function /** * Received a connection request. * @param fd: file descriptor to parse from (client) * @param sd: client session * @param command: packet type sent * @param ip: ipv4 address (client) * S 0064 <version>.L <username>.24B <password>.24B <clienttype>.B * S 0277 <version>.L <username>.24B <password>.24B <clienttype>.B <ip address>.16B <adapter address>.13B * S 02b0 <version>.L <username>.24B <password>.24B <clienttype>.B <ip address>.16B <adapter address>.13B <g_isGravityID>.B * S 01dd <version>.L <username>.24B <password hash>.16B <clienttype>.B * S 01fa <version>.L <username>.24B <password hash>.16B <clienttype>.B <?>.B(index of the connection in the clientinfo file (+10 if the command-line contains "pc")) * S 027c <version>.L <username>.24B <password hash>.16B <clienttype>.B <?>.13B(junk) * S 0825 <packetsize>.W <version>.L <clienttype>.B <userid>.24B <password>.27B <mac>.17B <ip>.15B <token>.(packetsize - 0x5C)B * @param fd: fd to parse from (client fd) * @return 0 failure, 1 success */ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int command, char* ip){ size_t packet_len = RFIFOREST(fd); i see for command 0x64 ( Request login authentification ) S 0064 <version>.L <username>.24B <password>.24B <clienttype>.B my code Packet Structure [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] struct DataPacket { public ushort command; public ulong version; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)] //.24B byte, Server Code Ask 24B ( 24 Bytes ) public String Username; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)] //Some 24 Byte Lenght public String Password; public byte clienttype; //is wrong? public byte[] Serialize() { // allocate a byte array for the struct data var buffer = new byte[Marshal.SizeOf(typeof(DataPacket))]; // Allocate a GCHandle and get the array pointer var gch = GCHandle.Alloc(buffer, GCHandleType.Pinned); var pBuffer = gch.AddrOfPinnedObject(); Marshal.StructureToPtr(this, pBuffer, false); gch.Free(); return buffer; } // this method will deserialize a byte array into the struct. public void Deserialize(ref byte[] data) { var gch = GCHandle.Alloc(data, GCHandleType.Pinned); this = (DataPacket)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(DataPacket)); gch.Free(); } } DataPacket packet = new DataPacket(); packet.command = 0x64; packet.version = 55; packet.Username = "Thejuster"; packet.Password = "123456789"; packet.clienttype = 0; var bytes = packet.Serialize(); soc.Send(bytes); If i try to connect whit my code, i see this on server. I see username and password server dont read. Normal Connection whit Ragnarok Client Uhmmm i dont have idea for this problem. I have download roBrowser, and see src. because javascript and c# are similar. i find this i on source // 0x64 PACKET.CA.LOGIN = function PACKET_CA_LOGIN() { this.Version = 0; this.ID = ''; this.Passwd = ''; this.clienttype = 0; }; //Here i think the author build a packet structure. PACKET.CA.LOGIN.prototype.build = function() { // i think is a size of all packet //[2] Command + [4] ???? No have idea. + [24] Username + [24] Password + [1] Client type var pkt_len = 2 + 4 + 24 + 24 + 1; var pkt_buf = new BinaryWriter(pkt_len); pkt_buf.writeShort(0x64); pkt_buf.writeULong(this.Version); pkt_buf.writeString(this.ID, 24); pkt_buf.writeString(this.Passwd, 24); pkt_buf.writeUChar(this.clienttype); return pkt_buf; }; Edited November 4, 2018 by Thejuster Quote
0 Zell Posted November 5, 2018 Posted November 5, 2018 I don't think that username and password should be a string Get it? Quote
0 Thejuster Posted November 12, 2018 Author Posted November 12, 2018 nope uhmm here are a problem. look total size sent is 72bytes. Simple i pack command,verion,username,password,clienttype total = 72byte but rAthena server ask: static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int command, char* ip){ size_t packet_len = RFIFOREST(fd); if( (command == 0x0064 && packet_len < 55) //For command 0x64 packet max lenght is 55 byte i use this. 0x64 || (command == 0x0277 && packet_len < 84) || (command == 0x02b0 && packet_len < 85) || (command == 0x01dd && packet_len < 47) || (command == 0x01fa && packet_len < 48) || (command == 0x027c && packet_len < 60) my packet size is 72byte but a conditional branch on server is limited under 55byte. Strange for me. No have idea for wath reason my structure is 72bytes. I follow step by step server parameters and Unmanaged conversion. Quote
0 Thejuster Posted April 2, 2019 Author Posted April 2, 2019 (edited) Hello again try whit this error Connection refused: IP isn't authorised (deny/allow, ip: 127.0.0.1). changed structure to ulong and int to sbyte and work. i have an bytes array around 51bytes total if( (command == 0x0064 && packet_len < 55) And i think now work but server block 127.0.0.1 address Edited April 2, 2019 by Thejuster Quote
Question
Thejuster
Hello i try to make a discord bot whit potential feature.
One my problem is try to connection in rAthena Server.
Actually i use c#
my code
When i try to connect, rAthena Login Server say this:
anyone know reason of this problem?
9 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.