Advertising Linux Minecraft Servers to the LAN

Published

Minecraft server list

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.

import socket
import time

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"

while 1:
        for server in servers:
                msg = "[MOTD]%s[/MOTD][AD]%d[/AD]" % (server[0], server[1])
                sock.sendto(msg, (BROADCAST_IP, BROADCAST_PORT))
        time.sleep(1.5)

Update

I was looking back through some of my old stuff and realised that the broadcast address I use above is not always technically correct. In most cases you can probably leave it at 255.255.255.255 so I definitely encourage you to give that a go first. I think the only reason it may fail is if your computer belongs to more than one subnet.

If your servers aren’t showing up then first check the obvious thing – firewalls! Failing that, try using the calculator below to find the specific broadcast address for your subnet and use that instead.

Broadcast Address Calculator

Enter your IP address and subnet mask.

Your subnet broadcast address is 192.168.0.255