Hi and thank you in advance for taking the time to help. As I have less than 5 posts it said I had to remove the links you will need to help so good luck!
I am having issues building a packet and sending it to a Minecraft RCon server.
This is the Minecraft RCon Protocol information can be found here (link removed)
It is an implementation of the source RCon protocol (link removed)
The basis of my code is (link removed)
The completed code of that linux question can be found here (link removed)
My modifications so far are listed below, I know its not elegant but then im working with someone elses code style and really just experimenting to see what works. So far I can tell that a socket is being created but cant figure out how to build a packet of the format required and cant tell if anything is being set at all.
-
The documentation say's that the packet components are 32bit littleendian integers, I have no idea how to do that. I think because im on linux they are littleendian but how do I make them 32bit.
-
The payload must be byte[] form, I am not sure how to do that either.
-
Still also trying to find a way to get a response from the server.
My experimenting so far:
#!/bin/bash
# configuration
HOST=""
PORT=
PASSWORD=""
REQUESTID=$RANDOM
COMMAND="$1 $2 $3 $4 $5"
# define functions
socksend ()
{
REQUESTID="1"
TYPE="$2"
PAYLOAD="$PAYLOAD"
echo "Host: $HOST"
echo "Port: $PORT"
echo "sending: $PAYLOAD"
#echo -ne "$SENDME" >&5 &
DATA=$REQUESTID
#+$TYPE+$PAYLOAD
#LANG=C LC_ALL=C # Googled this. Not sure how this line works but was intended to make length in bytes. Redundant now.
LENGTH=`echo -n $DATA | wc -m`
#${#DATA}
#LANG=$oLang LC_ALL=$oLcAll # Googled this. Not sure how this line works but was intended to make length in bytes. Redundant now.
echo "Length: $LENGTH"
printf '$LENGTH$DATA%s\0%s\0' >&5 &
}
sockread ()
{
LENGTH="$1"
RETURN=`dd bs=$1 count=1 <&5`
}
#2> /dev/null
echo "trying to open socket"
# try to connect
if ! exec 5<> /dev/tcp/$HOST/$PORT; then
echo "`basename $0`: unable to connect to $HOST:$PORT"
exit 1
fi
echo "socket is open"
# send login request
TYPE=3
PAYLOAD="$PASSWORD"
echo "Payload: $PAYLOAD"
socksend $REQUESTID $TYPE $PAYLOAD
# read 7 bytes for "success"
sockread 1
echo "RETURN: $RETURN"
echo "sending part 2"
TYPE=2
PAYLOAD="$COMMAND"
echo "Payload: $PAYLOAD"
socksend $REQUESTID $TYPE $PAYLOAD
# read 7 bytes for "success"
sockread 1
echo "RETURN: $RETURN"
Output so far:
trying to open socket
socket is open
Payload: #########
Host: #.#.#.#
Port: #####
sending: ########
Length: 1 0+0
records in 0+0
records out 0
bytes copied, 0.00115984 s, 0.0 kB/s
RETURN:
sending part 2
Payload: time set night
Host: #.#.#.#
Port: #####
sending: time set night
Length: 1 0+0
records in 0+0
records out 0
bytes copied, 2.9759e-05 s, 0.0 kB/s
RETURN:
There are probably a lot of things im doing wrong but I don't work with binary much. Bash was chosen as its the easiest for me to interface with other sources. Would like to keep this as simple as possible so the staff of my community will have a chance of being able to understand and use it to some degree. I will rewrite this in my own code style later but for now im just wanting to get it working.