1The line that matters
Minecraft 1.21.1's log, on Linux
Starting Minecraft server on *:25577
**** FAILED TO BIND TO PORT!
The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
Perhaps a server is already running on that port?
The server tried to take its port, couldn't, and stopped. Read the line that starts with "The exception was": it names the reason. The last line is printed whatever the reason, so it can be wrong.
2Three reasons, from our tests
On 29 Sep we started Minecraft 1.21.1's own server jar on Linux, as a normal user, three ways:
| What was wrong | The exception, on Linux | On Windows, Java 21 |
|---|---|---|
| Another program already listened on the port | bind(..) failed: Address already in use | java.net.BindException: Address already in use: bind |
server-ip=203.0.113.10, an address the machine doesn't have | bind(..) failed: Cannot assign requested address | java.net.BindException: Cannot assign requested address: bind |
server-port=80, as a user that isn't root | bind(..) failed: Permission denied | Doesn't apply |
Linux servers use Netty's own network code, hence NativeIoException. With use-native-transport=false, Java's standard networking, which Windows and macOS always use, the first case read java.net.BindException: Address already in use, and Windows adds : bind.
3The fix for each
- Address already in use: find what has the port. Often it's the same server started twice, an old copy still running in another window or session. On Linux,
sudo ss -ltnp 'sport = :25565'names the program; on Windows,netstat -ano | findstr :25565gives its process ID. Stop it, or give your server another port withserver-port, like 25566. - Cannot assign requested address: empty
server-ip. With it empty the server listens on every address the machine has, which is what you want almost always. - Permission denied: use a port from 1024 up. Linux keeps the ports below 1024 for root. Use 25565 and put a DNS SRV record in front, if you want an address without a port.
- Inside one server, two things on one port: an RCON port or a plugin's own port set to the game's port clashes with it. Query can share it: ours ran with
query.porton the game's port, since query uses UDP and the game TCP.
What ss showed while our test port was taken
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 1 127.0.0.1:25577 0.0.0.0:* users:(("nc",pid=4321,fd=5))
4On a Playkeeper server
- Each server gets its own port, 25565 for the first and one more from 25566 for each further server, so two of yours never ask for the same one.
- When another program has a server's port, the Overview says Port 25565 is already in use, with a button to give the server a different port.
- When it happens inside the server, it explains the cause: a plugin, a mod or RCON set to the game's port, or a
server-ipthe machine doesn't have.
Questions
What does FAILED TO BIND TO PORT mean?
The server couldn't take its port, so it stopped. The line after it says why: another program has the port, server-ip names an address the machine doesn't have, or the port is under 1024 without root.
Is a server already running on that port?
Only if the exception says Address already in use; the log suggests it whatever the reason. Check with ss on Linux or netstat on Windows.
What should server-ip be?
Empty. The server then listens on every address the machine has.