Pixel Streaming Matchmaker Error 'WARNING: No Empty Cirrus Servers are available'

I’ve been working on issue for some days, but I can’t figure out any solutions…

I’m testing this in Local computer.

  • I’m using default Pixel Streaming Matchmaker from github ‘EpicGames/PixelStreamingInfrastructure’.

  • I’m also using default Start_SignallingWebServer.ps1 from same repository.

  • I’ve Opened Port in my Windows Firewall Advanced Settings.

  • I found similar question asked here, but the solution mentioned there (to turn on Unreal Instances with Matchmaker and SignallingWebServer before connecting to Matchmaker IP) didn’t worked out for me.

This is the steps that I went through.

  1. When I Open Matchmaker by open ‘run.bat’ from ‘PixelStreamingInfrastructure\Matchmaker\platform_scripts\cmd’, it works well like below

  1. After Open Matchmaker, I Open Start_SignallingWebServer with PowerShell, and it connects to Matchmaker without issue.

  1. Then I Open Unreal Instances(Application that I built from Unreal Project with Pixel Streaming Plugin) it Connects to SignallingWebServer without issue.


  1. When I checked matchmaker.js from ‘PixelStreamingInfrastructure\Matchmaker’, I found in function ‘getAvailableCirrusServer()’, when cirrusServer’s numConnectedClients is 0, and ready is true, it returns cirrusServer itself.

  1. So, in the ‘ping’ message from matchmaker, I added console.log which is

to print Number of Clients in ${cirrusServer.address}:${cirrusServer.port}: ${cirrusServer.numConnectedClients}, ${cirrusServer.ready} in Matchmaker run.bat.

When I check this log in Matchmaker’s run.bat file running, it shows log

Number of Clients in MyIPAddress: 0, true

This means that getAvailableCirrusServer() have to return cirrusServer, as there is no clients connected to signallingwebserver that I opened, and also instance is connected to signallingwebserver,.
This also means, as I know, that Matchmaker should be able to redirect any clients connected to itself to signallingwebserver.

But it doesn’t work as I imagined. When I open Chrome browser and enter to Matchmaker’s IP Address and Port,

it shows message like this - ‘WARNING: No empty Cirrus servers are available’.

This log should be printed when getAvailableCirrusServer() failed to find any cirrusServer (which is SignallingWebServer).

But as you see in the picture (Matchmaker getAvailableCirrusServer), I’ve added some console.log to check whether the function enters if branch, and it actually enters, as you see in the picture above.

However, at the same time, it also shows log outside the loop, which is very awkward to me… because when the function already enters if statement, it has to return cirrusServer and get out from the function, but it is not working like that right now.

I want to know why the logs that shouldn’t be printed at same time is actually printing at same time, and ultimately solve this Matchmaking server issue (No empty Cirrus Servers)…

Would be grateful if someone provide me any ideas!

I’ve found that in the function ‘getAvailableCirrusServer()’,
it always goes inside the if(cirrusServer.numConnectedClients === 0 && cirrusServer.ready === true) statement, when I turn on all three elements (matchmaker, signallingwebserver, unreal instance), and all are properly connected.

This is where getAvailableCirrusServer() is called in matchmaker.js.
I’ve searched through web and found out that app.get() is kind of callback or event function - “middleware” to be precise, but I really didn’t learn anything about javascript yet…

The reason why there were both ‘cirrus server exist’ and ‘Why’ log,
because when I try to connect to matchmaker with my chrome browser,
getAvailableCirrusServer() which is called very first time return cirrusServer correctly, and get out of the function as it has to be.

But then, the getAvailableCirrusServer() is called again (called again by app.get() that I mentioned above), and as it is already redirecting as it has to be when it was first called, second function call went through the inner if statement ( cirrusServer.hasOwnProperty(‘lastRedirect’) ), and eventually meet ‘continue’, and went out from the loop, and prints log ‘Why’, ‘WARNING’, and then return undefined - which calls sendRetryResponse(res) function and put message on the browser.

I eventually found out that matchmaker.js is working as it has to be, but still cannot know why the app.get() is called so often, and browser is failing to connect with matchmaker. Hoping someone could spare me any ideas!

Problem Solved!

My Problem was that I was mentioning Port number after the IP Address (like IPAddress:Port) in the parameter when I open the SignallingWebServer.

(I wrote IPAddress like that, because when I first tested connecting seperate SignallingServer with seperate browsers (without matchmaker), I needed this way… but it found to be wrong when using matchmaker.)

Because of that, when Matchmaker reads SignallingWebServer’s IP Address, it becomes like IPAddress:Port:Port, which eventually leads it to try connecting double times. As it called double time, at first it was connected and matchmaker.js returns cirrusServer as it has to be, but then other connections comes in right away, so matchmaker thinks the servers are already occupied, so it returns undefined and printed error messages.

I’m not sure if someone will see this question, but hope if this can help someone challenging matchmaker.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.