Forum

> > CS2D > General > RCON how to check successful connection
Forums overviewCS2D overviewGeneral overviewLog in to reply

English RCON how to check successful connection

2 replies
To the start Previous 1 Next To the start

old RCON how to check successful connection

Marcell
Super User Off Offline

Quote
Hey!

I am trying to test somehow the rcon connection, but I don't know how normally do you check if the connection is valid and successful.

I mean there isn't really a persistent connection, but how could I ensure the RCON password is valid and the server received without doing anything particular on the server.

Right now this is how I send a command:

Could someone point me to the right direction, please?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const dgram = require('dgram');

class RCON {
    static sendCommand(ip, port, password, command) {
        return new Promise((resolve, reject) => {
            console.log(`\nSending RCON command to ${ip}:${port}`);
            console.log(`Command: ${command}`);

            const client = dgram.createSocket('udp4');
          

            const header = Buffer.from([0x01, 0x00, 0xF2]);
            const passwordLength = Buffer.from([password.length]);
            const commandLength = Buffer.alloc(2);
            
            const commandBuffer = Buffer.from(command, 'latin1');
            commandLength.writeUInt16LE(commandBuffer.length, 0);

            const packet = Buffer.concat([
                header,
                passwordLength,
                Buffer.from(password),
                commandLength,
                commandBuffer
            ]);

            
            const operationTimeout = setTimeout(() => {
                if (client) {
                    client.close();
                }
                console.log('Operation timed out - No response from server');
                reject(new Error('RCON request timed out'));
            }, 2000);

            client.on('error', (err) => {
                console.error('RCON socket error:', err);
                clearTimeout(operationTimeout);
                if (client) {
                    client.close();
                }
                reject(err);
            });

            client.on('message', (msg) => {
                clearTimeout(operationTimeout);
                

                const responseHeader = msg.slice(0, 3);

                if (msg.length === 7) {
                    const responseType = msg[4];
                    
                    if (responseType === 0x33) { // "3" - Server is blocking us
                        console.log('Server is blocking RCON commands - Too many failed attempts');
                        client.close();
                        reject(new Error('RCON blocked - Too many failed attempts'));
                        return;
                    }
                    
                    if (responseType === 0x34) { // "4" - Wrong password
                        console.log('Wrong RCON password');
                        client.close();
                        reject(new Error('Wrong RCON password'));
                        return;
                    }
                }

                let responseContent;
                if (msg.length > 5) {
                    const contentBuffer = msg.slice(5);
                    responseContent = contentBuffer.toString('utf16le').replace(/\u0000/g, '');
                } else {
                    responseContent = msg.slice(3).toString('latin1');
                }
                
                console.log('\nResponse:', responseContent);
                
                client.close();
                resolve({ success: true, response: responseContent });
            });

            client.bind(() => {
                client.send(packet, 0, packet.length, port, ip, (err) => {
                    if (err) {
                        console.error('Error sending RCON command:', err);
                        clearTimeout(operationTimeout);
                        if (client) {
                            client.close();
                        }
                        reject(err);
                    } else {
                        console.log('Command sent successfully, waiting for response...');
                    }
                });
            });
        });
    }
}

module.exports = RCON;

old Re: RCON how to check successful connection

DC
Admin Off Offline

Quote
Like you already said there is no persistent connection when using RCon. You only send data via RCon when you're actually trying to run commands.

Therefore I think the only way is to run a command and see if it returns a normal message or an error. There are some commands which don't really do much and which could be used for that.
e.g. cs2d cmd echo or cs2d cmd server which just prints the server name/address
You could also change a setting which has no impact on the server. e.g. you could set cs2d cmd renderdecoration to 0. It makes no difference because dedicated servers don't render anything at all.

old Re: RCON how to check successful connection

cs2d_is_a_Gem
User Off Offline

Quote
I think you can do something:
The checkConnection function is a helper method designed to verify whether an RCON (Remote Console) connection to a game server is working correctly.

Here's how it works step by step:
To check if the IP, port, and RCON password are valid, and that the server is accepting commands.
It uses another function called RCON.sendCommand() to send a simple command to the server:
1
echo "ping"

This command is harmless and just tells the server to respond with "ping"
If the server responds correctly and includes "ping" in the message:
We know the connection and password are both working.
So it returns:

1
{ success: true }
If the response doesn’t include "ping":
It throws an error because the server might not be working properly or is sending an unexpected response.
If there’s a connection error, wrong password, or timeout:
The function catches that error and returns:

1
{ success: false, error: "Some error message" }

Why use echo "ping"?
Because echo is a safe, read-only command. It doesn’t change any settings or affect the server. It’s perfect for checking whether RCON works without doing anything destructive.

1
2
3
4
5
6
7
8
9
10
11
12
13
static checkConnection(ip, port, password) {
    return RCON.sendCommand(ip, port, password, 'echo "ping"')
        .then((res) => {
            if (res.response.includes('ping')) {
                return { success: true }; // Everything is OK
            } else {
                throw new Error('Unexpected response from server');
            }
        })
        .catch((err) => {
            return { success: false, error: err.message }; // Something went wrong
        });
}
To the start Previous 1 Next To the start
Log in to replyGeneral overviewCS2D overviewForums overview