Quick answer: The most common cause is a firewall or port forwarding issue. Unreal dedicated servers listen on UDP port 7777 by default. If that port is blocked by the host machine's firewall or not forwarded on the router, client connection attempts will time out.

Here is how to fix Unreal dedicated server client not connecting. You build and launch your Unreal dedicated server. It appears to start correctly — the log says it is listening for connections. You launch a client and use the open console command with the server's IP address. Nothing happens. The client sits on the loading screen, eventually times out, and returns to the main menu. The server log shows no indication that a connection was ever attempted. This is one of the most common and most frustrating multiplayer issues in Unreal Engine, and it usually comes down to network configuration, engine INI settings, or a missing GameMode.

The Symptom

You have built a dedicated server target of your Unreal project, either through the editor's packaging system or via UnrealBuildTool with the Server target. You launch the server binary with a command like MyGameServer.exe MapName -log. The server starts up and the log output includes a line such as LogNet: GameNetDriver IpNetDriver listening on port 7777. Everything on the server side appears normal.

On the client side, you open the console and type open 192.168.1.100:7777 or the equivalent public IP. The client begins a connection attempt but never completes it. You may see LogNet: Browse: Attempting to connect to 192.168.1.100:7777 in the client log, followed by a long pause and then LogNet: UNetConnection::Close or a timeout message. In some cases, the client log shows no connection attempt at all, which indicates the travel URL was never processed.

On the server side, there are no log entries about an incoming connection. The server continues running its game loop as though no client ever tried to reach it. This complete silence on the server side is the key clue that the packets are not arriving, which points to a network-level or configuration-level problem rather than a gameplay logic issue.

What Causes This

1. Missing or incorrect NetDriver configuration in DefaultEngine.ini. Unreal Engine requires explicit NetDriver definitions in the engine configuration file for networked games. If the [/Script/Engine.GameEngine] section does not contain a valid NetDriverDefinitions entry, or if the net driver class name is misspelled, the server will start but will not actually bind to a network socket. The log may still say it is listening, but no real socket is open. This is especially common in new projects that were not originally set up for multiplayer.

2. Port blocked by firewall or not forwarded. The dedicated server listens on UDP port 7777 by default. On the server machine, the operating system firewall may block incoming UDP traffic on that port. On a remote network, the router must have port forwarding configured to direct traffic on port 7777 to the server machine's local IP address. Many developers test on localhost first, where firewalls are not an issue, and then are surprised when remote connections fail.

3. No GameMode or wrong default map. The dedicated server needs a valid AGameModeBase subclass assigned for the map it loads. If the server starts with no map (because DefaultGame.ini has no ServerDefaultMap set) or with a map that has no GameMode override and the project's default GameMode does not support dedicated servers, the connection handshake fails. The client may connect briefly at the network layer but gets disconnected during the map travel process because there is no valid game session to join.

4. Travel URL format is wrong on the client. The open command and ClientTravel function expect a specific URL format. Common mistakes include using http:// prefixes, specifying a map name after the IP (which is only valid for listen servers), or omitting the port number when using a non-default port. The client silently fails to parse the malformed URL and never initiates a connection.

The Fix

Step 1: Configure the NetDriver in DefaultEngine.ini. Open your project's Config/DefaultEngine.ini and add the required networking sections. These settings tell the engine which net driver class to use and how to configure the network tick rate.

; Config/DefaultEngine.ini - Required networking configuration

[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="IpNetDriver",DriverClassNameFallback="IpNetDriver")

[/Script/OnlineSubsystemUtils.IpNetDriver]
MaxClientRate=100000
NetServerMaxTickRate=60
InitialConnectTimeout=120.0
ConnectionTimeout=80.0

[/Script/Engine.Player]
ConfiguredInternetSpeed=100000
ConfiguredLanSpeed=100000

[URL]
Port=7777

After editing the INI file, verify it is being read by checking the server's startup log for the NetDriver initialization line. If the log says IpNetDriver listening on port 7777, the configuration is correct. If it says GameNetDriver is null or there is no mention of a net driver, the INI section names may be wrong or the file is not being loaded from the expected path.

Step 2: Open the port and verify network reachability. Before debugging Unreal configuration further, confirm that traffic can actually reach the server process. On the server machine, check that the port is bound and that the firewall allows it.

// C++ helper to log the server's actual listening address and port
void AMyGameMode::BeginPlay()
{
    Super::BeginPlay();

    if (GetNetMode() == NM_DedicatedServer)
    {
        UNetDriver* NetDriver = GetWorld()->GetNetDriver();
        if (NetDriver && NetDriver->ServerConnection == nullptr)
        {
            UE_LOG(LogTemp, Log, TEXT("Dedicated server is running."));
            UE_LOG(LogTemp, Log, TEXT("NetDriver: %s"), *NetDriver->GetName());
            UE_LOG(LogTemp, Log, TEXT("Listen URL: %s"), *NetDriver->LowLevelGetNetworkNumber());

            // Log all connected clients (should be 0 at startup)
            UE_LOG(LogTemp, Log, TEXT("Connected clients: %d"),
                NetDriver->ClientConnections.Num());
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("No valid NetDriver. Check DefaultEngine.ini."));
        }
    }
}

// Also override PreLogin to log connection attempts
void AMyGameMode::PreLogin(const FString& Options,
    const FString& Address, const FUniqueNetIdRepl& UniqueId,
    FString& ErrorMessage)
{
    UE_LOG(LogTemp, Log, TEXT("PreLogin from %s with options: %s"),
        *Address, *Options);

    Super::PreLogin(Options, Address, UniqueId, ErrorMessage);

    if (!ErrorMessage.IsEmpty())
    {
        UE_LOG(LogTemp, Error, TEXT("PreLogin rejected: %s"), *ErrorMessage);
    }
}

On the host machine, use your operating system's network tools to verify the port is open. On Windows, run netstat -an | findstr 7777. On Linux, run ss -ulnp | grep 7777. You should see the server process listed as listening on UDP port 7777. If the port does not appear, the NetDriver failed to bind and the INI configuration needs review.

For remote connections across the internet, forward UDP port 7777 on the router to the server machine's local IP. Test the port with an external reachability tool before attempting to connect from the game client. Many hours of debugging are wasted on Unreal configuration when the real problem is a closed port.

Step 3: Set the server GameMode and default map. The dedicated server must load into a valid map with a GameMode that supports multiplayer sessions. Configure these in your project's DefaultGame.ini and in the GameMode class itself.

// MyGameMode.h - A GameMode configured for dedicated servers
UCLASS()
class AMyGameMode : public AGameModeBase
{
    GENERATED_BODY()

public:
    AMyGameMode();

    virtual void PreLogin(const FString& Options,
        const FString& Address, const FUniqueNetIdRepl& UniqueId,
        FString& ErrorMessage) override;
    virtual APlayerController* Login(UPlayer* NewPlayer,
        ENetRole InRemoteRole, const FString& Portal,
        const FString& Options, const FUniqueNetIdRepl& UniqueId,
        FString& ErrorMessage) override;
    virtual void PostLogin(APlayerController* NewPlayer) override;
};

// MyGameMode.cpp
AMyGameMode::AMyGameMode()
{
    // Set default pawn and HUD classes for dedicated server
    DefaultPawnClass = AMyCharacter::StaticClass();
    PlayerControllerClass = AMyPlayerController::StaticClass();

    // Allow seamless travel for map changes
    bUseSeamlessTravel = true;
}

void AMyGameMode::PostLogin(APlayerController* NewPlayer)
{
    Super::PostLogin(NewPlayer);

    UE_LOG(LogTemp, Log, TEXT("Player logged in: %s"),
        *NewPlayer->GetName());

    // Spawn the player at a PlayerStart
    RestartPlayer(NewPlayer);
}

// Launch the server with the correct map and GameMode:
// MyGameServer.exe /Game/Maps/Lobby?game=/Script/MyGame.MyGameMode -log -port=7777

// Client connects with the open command:
// open 192.168.1.100:7777

// Or programmatically via ClientTravel:
void AMyPlayerController::ConnectToServer(const FString& IPAddress)
{
    ClientTravel(IPAddress, ETravelType::TRAVEL_Absolute);
}

Make sure the map specified in the server launch command is valid and fully cooked. If the map name is misspelled or the map was excluded from the packaging settings, the server will fall back to an empty map or fail to start entirely. Check DefaultGame.ini for the ServerDefaultMap entry to ensure it matches a real asset path in your project.

Related Issues

If clients connect successfully but replicated variables are not updating across the network, see our guide on replicated variables not syncing. If your dedicated server build crashes on startup before it even reaches the listening state, check out fixing packaged build crashes on startup.

If the server log shows no connection attempt, the packets never arrived. Check the port first.