UE5 Dedicated Server Steam Session Connection Issue - "ValidP2P[0] ValidHost[1] ConnectionMethod[P2P]"

Hello everyone,

I’m currently developing a multiplayer game in Unreal Engine 5.6 and facing a persistent issue with connecting to a Dedicated Server via Steam Online Subsystem (OSS).

My client successfully finds the Dedicated Server session using a unique secret key in SessionSettings. The discovery works perfectly, and JoinSession returns Success (0). However, the address resolution stage fails.

When calling GetResolvedConnectString, I receive the following warning in the logs:
LogOnlineSession: Warning: STEAM: Steam could not resolve session info! ValidP2P[0] ValidHost[1] ConnectionMethod[P2P]
LogOnlineSession: Warning: STEAM: Invalid session info for session GameSession in GetResolvedConnectString()

What Ive tried:

  1. Set bUsesPresence = false and bUseLobbiesIfAvailable = false on the Server side during session creation.
  2. Set bIsDedicated = true and bShouldAdvertise = true
  3. Ensured that the Dedicated Server is correctly logged into Steam GameServer API (logs confirm success).
  4. Verified that Ports 7777 (Game) and 27015 (Query) are open.
  5. Implemented a manual fallback in C++ to extract the IP via JoinedSession->SessionInfo->GetAddress(). While this manually provides an IP:Port string, I would like to understand why the standard engine logic is forcing a P2P connection method for a headless dedicated server.

Question:
Why does the Steam OSS default to ConnectionMethod[P2P]* even when bUsesPresence is disabled? It seems the engine expects a valid SteamID for P2P, which the Dedicated Server doesn’t provide in this context. Is there a specific flag or config in DefaultEngine.ini to force the Steam Subsystem to prefer IP-based resolution for Dedicated Servers on AppID 480?

Any help or insight would be greatly appreciated!

image


void USC_SessionSubsystem::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{
	UE_LOG(LogTemp, Error, TEXT("===== JOIN SESSION COMPLETE ====="));
	UE_LOG(LogTemp,Error,TEXT("Session Name: %s"),*SessionName.ToString());
	UE_LOG(LogTemp,Error,TEXT("Join Result: %d"),static_cast<int32>(Result));

	FString ConnectString;

	bool bResolved = SessionInterface->GetResolvedConnectString(SessionName,ConnectString);

	UE_LOG(LogTemp,Error,TEXT("GetResolvedConnectString: %s"),bResolved ? TEXT("TRUE") : TEXT("FALSE"));

	if (!bResolved)
	{
		FNamedOnlineSession* JoinedSession = SessionInterface->GetNamedSession(SessionName);

		if (JoinedSession && JoinedSession->SessionInfo.IsValid())
		{
			bResolved = SessionInterface->GetResolvedConnectString(FoundServer, NAME_GamePort, ConnectString);
		}
	}

	if (bResolved)




	{
		UE_LOG(LogTemp, Error, TEXT("CONNECT STRING: %s"), *ConnectString);
		
		if (APlayerController* PC = GetWorld()->GetFirstPlayerController())
		{
			PC->ClientTravel(ConnectString, ETravelType::TRAVEL_Absolute);
		}

		else
		{
			UE_LOG(LogTemp, Error, TEXT("!!!!!!!!!Something with PlayerController!!!!!!!!!"));
		}
	}
	else
	{
		UE_LOG(LogTemp, Error, TEXT("CRITICAL: FAILED TO RESOLVE CONNECT STRING BY 
ALL METHODS"));
	}
}