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:
- Set bUsesPresence = false and bUseLobbiesIfAvailable = false on the Server side during session creation.
- Set bIsDedicated = true and bShouldAdvertise = true
- Ensured that the Dedicated Server is correctly logged into Steam GameServer API (logs confirm success).
- Verified that Ports 7777 (Game) and 27015 (Query) are open.
- 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!
![]()
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"));
}
}