My 5 year old son is really in to playing Minecraft at the moment and always wants me to play with him. I set up a couple of Minecraft servers on a Linux machine on my local network so that any of us could hop in and out from any computer. Annoyingly I found that the server for Linux does not broadcast its whereabouts to the LAN, so I had to manually enter the address and ports of the servers on every client.
Well that seemed unnecessary so I opened up Wireshark to see how the Windows and Mac clients announce their LAN games and came up with the following script. I decided to use Python simply because it was pre-installed on my Linux box and I didn’t want to install another language such as PHP just to handle this simple job. That said, I don’t know Python very well.
I run this script in a screen session on the Linux server. It announces the Minecraft servers to the LAN every 1.5 seconds using a UDP broadcast to the subnet. The clients always assume that the source IP of the broadcast is also the IP address of the Minecraft server, so this script must be run on the same box that is hosting the Minecraft servers. In other words, you can’t use this script to announce the whereabouts of a Minecraft server on a different machine. I believe that’s a protocol change to previous versions where this was indeed possible. At the time of writing, the current Minecraft version is 1.8.
You can add as many servers are you like to the servers array. The array contains arrays consisting of the server description and the port number.
servers = [
["Local Network - Survival Map", 25565],
["Local Network - Creative Playground", 25566]
BROADCAST_IP = "255.255.255.255"
BROADCAST_PORT = 4445
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
print "Broadcasting Minecraft servers to LAN"
for server in servers:
msg = "[MOTD]%s[/MOTD][AD]%d[/AD]" % (server, server)
sock.sendto(msg, (BROADCAST_IP, BROADCAST_PORT))