[0.12] Headless mode and multiple clients behind NAT

This subforum contains all the issues which we already resolved.
Boogalo
Inserter
Inserter
Posts: 24
Joined: Thu Dec 04, 2014 12:42 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Boogalo »

FishSandwich wrote:Your scenario assumes that the port is a fixed number for all clients, which isn't the case.
Where are you getting this information? I still think it is incorrect. All clients (and the server because it is just a client) want to talk on the same port, and if they can't, it fails.

Just tried:
Server on local network at 34199 (external port forwarded to server)
Local client on another machine at config set to 34197 (external port port forwarded to corresponding machine)
Remote client with config set to 34197 (must connect by using ADDRESS:34199")

Remote client can try to connect to ADDRESS:34197 or ADDRESS:34199 (both are valid connection points since everything is peer to peer). I see the connection attempts in the server console window. If i connect form the local client first, the remote client can't connect. If remote connects first, the local client can't connect. Both fail with the same error, can't connect to peer. It fails the same if the ports are reversed with the server on 34197 and the clients set to 34199 (and corrected on the router).

All players try to talk on the same port, and if they can't, connection fails.

MF- has mentioned the only likely way around this...with private VPN, hamachi, etc.

FishSandwich
Smart Inserter
Smart Inserter
Posts: 1847
Joined: Sun Feb 23, 2014 3:37 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by FishSandwich »

That brings us back to my second post here. ;)

The ports are configurable, but Factorio itself doesn't deal with it very well.

User avatar
cube
Former Staff
Former Staff
Posts: 1111
Joined: Tue Mar 05, 2013 8:14 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by cube »

Soooo ... a bit of explanation:

Factorio (and the whole world with it) uses a ip address, port tuple to identify services programs running on servers. That result of this is that you can run multiple instances of Factorio (or Apache, or anything) on one computer without any problems, you just need them to use different port numbers.

Factorio by default uses port 34197, but as FishSandwich wrote, it can be changed in config. That is 34197 UDP -- a completely different thing than 34197 TCP.

Example:
1) server running on internal network with IP 10.0.0.1, Factorio at default 34197
2) internal network client with IP 10.0.0.2, Factorio at default 34197
3) second internal client on the same machine (to complicate stuff a little) with IP 10.0.0.2, port 34198

at this point both 2) and 3) should be able to just write "10.0.0.1" into the MP connect dialog and play on the server
or even connect 3) first, using "10.0.0.1", then connect 2) using "10.0.0.2:34198"

But now let's consider that you want to play over the internet.
4) is your router. It has public IP address 12.34.56.78 and forwards its port 34197 to 10.0.0.1:34197
5) is your remote friend

If the server is running and no one is connected, then 5) can connect to "12.34.56.78:34197" and start playing.
But if 2) or 3) was connected before, 5) will get kicked with the message you described.

The reason why this will happen is that everyone in game holds addresses it uses to communicate with other peers in game and everyone must be able to reach them.
The addresses are copied to the peer when he connects.
In our problematic scenario the server holds a list like this:

Code: Select all

10.0.0.1:34197 myself
10.0.0.2:34197 2)
10.0.0.2:34198 3)
But from 5)'s point of view the addresses don't make sense. He cannot reach any of the peers using addresses from this list.

This is to some extent a limitation of the P2P model we are using and to some extent a problem Factorio's implementation.
A workaround is for 2) and 3) to connect to the server using its public address "12.34.56.78:34197" as well. This way the router will change the addresses to its own external address and a random port (and it will keep the mapping while it is in use), and the list sent to 5) will be correct.

To play this way, only1) needs to have port forwarding set up. This trick is called NAT punchthrough and relies on the router allowing an incoming packets for some time after a outgoing packet was sent...

This all assumes that the router behaves the way we expect it. Which it may not. In that case I need to know what works, what doesn't, what configuration are you using and what workarounds help. There is a huge room for improvement in Factorio networking code :-)

Boogalo
Inserter
Inserter
Posts: 24
Joined: Thu Dec 04, 2014 12:42 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Boogalo »

I hadn't thought of trying through the external for the internal clients. Will give that a go tonight and report back. It will let us know if Comcast and DDWRT routers support that kind of networking.

My understanding of what's going on looks correct (and it seems to behave as expected), but I'm not great at putting it to text.

Coelun
Manual Inserter
Manual Inserter
Posts: 3
Joined: Sun Nov 16, 2014 11:13 am
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Coelun »

I use the NAT loopback enabled routers.

Example)
server-192.168.x.1:11111(local IP),globalIP:9.8.7.6:11111 (forwarding)
myPC-192.168.x.2:11112(loacl IP),globalIP:9.8.7.6:11112(forwarding)
playerA-1.2.3.4:12345(global IP)

If don't use NAT loopback. use the local IP to server connection. 
can : myPC----->(local IP)server server:myPC=192.168.x.2:11112
can : playerA----->(global IP)((router)----->server) server:playerA=1.2.3.4:12345
can't : playerA(globalIP) <--x--> (loacl IP)myPC

###playerA's factorio-current.log###
24.159 Info Synchronizer.cpp:455: NetworkTick(517349) Requesting heartbeat for networkTick(517346) from peer(15). Drop detection state(600/600).
24.175 Error MultiplayerManager.cpp:107: MultiplayerManager failed: "192.168.x.2:11112 ~~~~~~~~~~~~~"
24.181 Info MultiplayerManager.cpp:848: networkTick(517349) mapTick(-1) changing state from(VerifyingConnection) to(Failed)

Now I use NAT loopback. I use a global IP to server connection.
can : myPC----->(global IP)((router)<----->server) server:myPC=9.8.7.6:11112 (*1)
can : playerA----->(global IP)((router)<----->server) server:playerA=1.2.3.4:12345
can : playerA(global IP)<----->(global IP)myPC

I bought a router that it can be.
As a result, I was able to connect to the playerA.

selkathguy
Inserter
Inserter
Posts: 20
Joined: Sat May 03, 2014 8:34 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by selkathguy »

I have a router which i can use to test the scenario that Cube outlined with a reasonable amount of confidence, should Boogalo's setup not work.

Bisa
Filter Inserter
Filter Inserter
Posts: 450
Joined: Fri Jul 17, 2015 3:22 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Bisa »

Thank you for the insider clarification Cube.
For those who are itnerested in:
A workaround is for 2) and 3) to connect to the server using its public address "12.34.56.78:34197" as well.
Please be aware that routers may or may not have built in protection for "NAT Loopback" essentially preventing LAN clients from accessing eachother via the routers public ip. According to the wiki article consumer routers should be fine but you never know - if you cannot access your headless client from the public ip if you are on the same LAN, NAT Loopback is probably what's messing with you as long as you've verified that the port forwarding works (ie your remote friends can join just fine)
Hosting a factorio server? Take a look at this || init script ||.

Boogalo
Inserter
Inserter
Posts: 24
Joined: Thu Dec 04, 2014 12:42 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Boogalo »

Coelun wrote: server-192.168.x.1:11111(local IP),globalIP:9.8.7.6:11111 (forwarding)
myPC-192.168.x.2:11112(loacl IP),globalIP:9.8.7.6:11112(forwarding)
playerA-1.2.3.4:12345(global IP)
Using this as a framework we started experimenting. Port numbers are actual.

server-192.168.x.1:34199(local IP),globalIP:9.8.7.6:34199(forwarding)
myPC-192.168.x.2:34197(local IP),globalIP:9.8.7.6:34197(forwarding) (connecting to server at globalIP:34199)
playerA-1.2.3.4:55980(global IP) (connecting to server globalIP)

The above did not work. When either was connected, the 2nd could not connect.

server-192.168.x.135:54199(local IP),globalIP:9.8.7.6:54199(forwarding)
myPC-192.168.x.100:54197(local IP),globalIP:9.8.7.6:54197(forwarding) (connecting to server globalIP:54197)
playerA-1.2.3.4:55980(global IP) (connecting to server globalIP) (not forwarding)

If myPC was connected to the server first, playerA connected ok. If playerA was connected first, myPC could not connect. It maintained this behavior whether or not playerA forwarded his port. When myPC connected, playerA got the error as 192.168.x.1:54197 couldn't connect to peer (.1 is the local gateway) myPC got the error for 1.2.3.4:55980

I switched server and myPC back to the 34199 and 34197 respectively and updated the forwards as an additional test and the original failure mode returned.

Both of my machines are Win7 Pro x64. Router: asus rt-n66u running DDWRT. Comcast for internet, using my own modem.

We'll continue the test with playerA and him hosting on his equipment.


\/ \/ \/ is playerA in my case
Last edited by Boogalo on Wed Jul 22, 2015 12:14 pm, edited 1 time in total.

selkathguy
Inserter
Inserter
Posts: 20
Joined: Sat May 03, 2014 8:34 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by selkathguy »

After trying a myriad of complex hand-crafted NAT translations, routing table entries, access-lists and vlans, I am suggesting this functionality be officially supported.

Suggested fix:
When the server sends the list of client addresses to the new client (if the new client is remote): For each client address with a private IP address, send a static, predefined value instead (e.g. "LOCAL"). When the new client reads the list, any address that has that predefined string will be replaced by the address it used to connect to the server. For client, if the server you are attempting to connect to is a private address, choose a random port in the dynamic range to connect from.

This should enable having the server and clients local to the server be able to connect along with multiple remote users. However you would still be unable to have multiple players connecting from the same IP (remote to the server).

Coelun
Manual Inserter
Manual Inserter
Posts: 3
Joined: Sun Nov 16, 2014 11:13 am
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Coelun »

Probably, Need a router selecting.
My router make the source IP change to the WAN IP.

http://gyazo.com/3e7cb31756a9db04aa1bfcbff237ad0b
image mistake:
x"Factorio server:11111"
o"Factorio server:11112"

But . I think that other router is not necessarily the same.
NAT is Fucking. Compatibility of NAT and P2P is bad.

Boogalo
Inserter
Inserter
Posts: 24
Joined: Thu Dec 04, 2014 12:42 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Boogalo »

This is all working in 0.12.4 :D

Thanks guys.

kovarex
Factorio Staff
Factorio Staff
Posts: 8078
Joined: Wed Feb 06, 2013 12:00 am
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by kovarex »

Great to hear that!

defty
Burner Inserter
Burner Inserter
Posts: 8
Joined: Tue Mar 25, 2014 1:27 pm
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by defty »

headless server 12.9 2nd user wants to join gets error

error from game hanging but look close and see why internal user can't connect together with external user
seperate connection possible but when en other user is trying to join it won't allow it.

log


79.683 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(553)
79.716 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(555)
79.749 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(557)
79.783 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(559)
79.816 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(561)
79.849 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(563)
79.883 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(565)
79.916 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(567)
79.949 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(569)
79.982 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(571)
80.016 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(573)
80.049 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(575)
80.083 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(577)
80.116 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(579)
80.149 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(581)
80.182 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(583)
80.216 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(585)
80.249 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(587)
80.283 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(589)
80.316 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(591)
80.350 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(593)
80.382 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(595)
80.416 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(597)
80.433 Info Synchronizer.cpp:444: NetworkTick(4755) peer(2) drop detection state(600/600).
80.450 Info Synchronizer.cpp:590: NetworkTick(4755) peer(2) peerHeartbeatsEmpty(true) is not responding, dropping.
80.450 Verbose NetworkInputHandler.cpp:218: Map tick(1797322) not closed failedCount(599)
80.700 Verbose Synchronizer.cpp:290: NetworkTick(4769) Processing synchronizer action(PeerInfo) from peer(0)
80.700 Info MultiplayerManager.cpp:1411: Received peer info for peer(0) username(<server>).
80.700 Verbose Synchronizer.cpp:290: NetworkTick(4769) Processing synchronizer action(PeerStateChanged) from peer(0)
80.700 Info MultiplayerManager.cpp:1059: networkTick(4769) mapTick(1797334) received stateChanged peerID(0) oldState(InGame) newState(InGame)
80.700 Verbose Synchronizer.cpp:290: NetworkTick(4769) Processing synchronizer action(PeerInfo) from peer(1) (local)
80.700 Info MultiplayerManager.cpp:1411: Received peer info for peer(1) username(defty).
80.700 Verbose Synchronizer.cpp:290: NetworkTick(4769) Processing synchronizer action(PeerStateChanged) from peer(1) (local)
80.700 Info MultiplayerManager.cpp:1059: networkTick(4769) mapTick(1797334) received stateChanged peerID(1) oldState(InGame) newState(InGame)
80.716 Verbose Synchronizer.cpp:290: NetworkTick(4770) Processing synchronizer action(PeerDisconnect) from peer(1) (local)
80.716 Info MultiplayerManager.cpp:1455: Disconnect notification for peer (1)
80.716 Info MultiplayerManager.cpp:1009: networkTick(4770) mapTick(1797335) removing peer(1) dropout(false)
80.716 Info MultiplayerManager.cpp:912: networkTick(4770) mapTick(1797335) changing state from(InGame) to(InGameAligning)
80.716 Info MultiplayerManager.cpp:1697: networkTick(4770) mapTick(1797335) starting mapAlign
80.716 Info MultiplayerManager.cpp:1611: networkTick(4770) mapTick(1797335) adding mapAlignTask(RemovePlayerAlignTask)
80.716 Verbose Synchronizer.cpp:290: NetworkTick(4770) Processing synchronizer action(PeerDropoutDetected) from peer(1) (local)
80.716 Info MultiplayerManager.cpp:1473: Peer dropout for peer (2) by peer (1) -- removing now
80.716 Info MultiplayerManager.cpp:1009: networkTick(4770) mapTick(1797335) removing peer(2) dropout(true)
80.716 Info Synchronizer.cpp:516: networkTick(4770) removing peer(2) success(false).
80.716 Info MultiplayerManager.cpp:1611: networkTick(4770) mapTick(1797335) adding mapAlignTask(RemovePlayerAlignTask)
90.483 Verbose Synchronizer.cpp:290: NetworkTick(4784) Processing synchronizer action(PeerDropoutDetected) from peer(0)
90.483 Info MultiplayerManager.cpp:1473: Peer dropout for peer (2) by peer (0) -- removing now
90.483 Info MultiplayerManager.cpp:1476: Peer dropout detected for not connected peer
90.499 Verbose Synchronizer.cpp:290: NetworkTick(4785) Processing synchronizer action(PeerStateChanged) from peer(0)
90.499 Info MultiplayerManager.cpp:1059: networkTick(4785) mapTick(1797335) received stateChanged peerID(0) oldState(InGame) newState(InGameAligning)
90.499 Verbose Synchronizer.cpp:290: NetworkTick(4785) Processing synchronizer action(PeerStateChanged) from peer(1) (local)
90.499 Info MultiplayerManager.cpp:1059: networkTick(4785) mapTick(1797335) received stateChanged peerID(1) oldState(InGame) newState(InGameAligning)
90.499 Info MultiplayerManager.cpp:1631: networkTick(4785) mapTick(1797335) sending mapAlignAction
90.750 Verbose Synchronizer.cpp:290: NetworkTick(4800) Processing synchronizer action(MapAlign) from peer(0)
90.750 Info MultiplayerManager.cpp:1305: networkTick(4800) mapTick(1797335) received MapAlignAction from peer(0), mapAlignTick(1797337) appliedTickClosuresCount(33)
90.750 Verbose Synchronizer.cpp:290: NetworkTick(4800) Processing synchronizer action(MapAlign) from peer(1) (local)
90.750 Info MultiplayerManager.cpp:1305: networkTick(4800) mapTick(1797335) received MapAlignAction from peer(1), mapAlignTick(1797336) appliedTickClosuresCount(0)
90.750 Info MultiplayerManager.cpp:1713: networkTick(4801) mapTick(1797335) mapAlign finished targetTick(1797337) updating map and running the tasks ...
90.750 Info MultiplayerManager.cpp:1585: networkTick(4801) mapTick(1797335) peerID(1) fullStateLog: local state(InGameAligning) local peers(((peerID(0) state(InGameAligning) mapAlignTick(1797337))
((peerID(1) state(InGameAligning) mapAlignTick(1797336))
)
90.750 Verbose NetworkInputHandler.cpp:559: expectedMapTick(1797335) NetworkTick(4801) lastTickApplied(1797317) tickCloseFailuresCount(602) dumping tickclosure queues ...
90.750 Verbose NetworkInputHandler.cpp:569: peer(0) playerIndex(65535) tickClosures([tick(1797318) inputActions() ] [tick(1797319) inputActions() ] [tick(1797320) inputActions() ] [tick(1797321) inputActions() ] [tick(1797322) inputActions() ] [tick(1797323) inputActions() ] [tick(1797324) inputActions() ] [tick(1797325) inputActions() ] [tick(1797326) inputActions() ] [tick(1797327) inputActions() ] [tick(1797328) inputActions() ] [tick(1797329) inputActions() ] [tick(1797330) inputActions() ] [tick(1797331) inputActions() ] [tick(1797332) inputActions() ] [tick(1797333) inputActions() ] [tick(1797334) inputActions() ] [tick(1797335) inputActions() ] [tick(1797336) inputActions() ] )
90.750 Verbose NetworkInputHandler.cpp:569: local peer(1) playerIndex(1) tickClosures([tick(1797318) inputActions() ] [tick(1797319) inputActions() ] [tick(1797320) inputActions() ] [tick(1797321) inputActions() ] [tick(1797322) inputActions((PlayerLeaveGame) (OpenCharacterGui) (SelectedEntityCleared) (StopRepair) ) ] [tick(1797323) inputActions() ] [tick(1797324) inputActions() ] [tick(1797325) inputActions() ] [tick(1797326) inputActions() ] [tick(1797327) inputActions() ] [tick(1797328) inputActions() ] [tick(1797329) inputActions() ] [tick(1797330) inputActions() ] [tick(1797331) inputActions() ] [tick(1797332) inputActions() ] [tick(1797333) inputActions() ] [tick(1797334) inputActions() ] [tick(1797335) inputActions() ] )
90.750 Verbose Synchronizer.cpp:477: NetworkTick(4801) notClosedTickStreak(0) dumping heartbeat queues ...
90.750 Verbose Synchronizer.cpp:489: peer(0) dropDetectionState(1) heartbeats()
90.750 Verbose Synchronizer.cpp:489: local peer(1) heartbeats([networkTick(4786) closedTick(true) ] [networkTick(4787) closedTick(true) ] [networkTick(4788) closedTick(true) ] [networkTick(4789) closedTick(true) ] [networkTick(4790) closedTick(true) ] [networkTick(4791) closedTick(true) ] [networkTick(4792) closedTick(true) ] [networkTick(4793) closedTick(true) ] [networkTick(4794) closedTick(true) ] [networkTick(4795) closedTick(true) ] [networkTick(4796) closedTick(true) ] [networkTick(4797) closedTick(true) ] [networkTick(4798) closedTick(true) ] [networkTick(4799) closedTick(true) ] [networkTick(4800) closedTick(true) ] [networkTick(4801) closedTick(false) ] )
90.752 Info NetworkInputHandler.cpp:87: expectedMapTick(1797336) refusing Input Action [1 1797335 CloseGui] because multiplayer control is not ready
90.752 Info NetworkInputHandler.cpp:87: expectedMapTick(1797336) refusing Input Action [1 1797335 CloseGui] because multiplayer control is not ready
90.752 Info NetworkInputHandler.cpp:87: expectedMapTick(1797336) refusing Input Action [1 1797335 CloseGui] because multiplayer control is not ready
90.752 Info NetworkInputHandler.cpp:87: expectedMapTick(1797336) refusing Input Action [1 1797335 CloseGui] because multiplayer control is not ready
90.752 Info NetworkInputHandler.cpp:87: expectedMapTick(1797336) refusing Input Action [1 1797335 Craft] because multiplayer control is not ready
90.754 Info MultiplayerManager.cpp:1732: maptick(1797337) crc before applying all ticks: -2146972599
90.754 Info NetworkInputHandler.cpp:644: applyAllTickClosures: expectedMapTick(1797337) lastTickApplied(1797319) referenceMapTick(1797337) networkTick(4801)
90.754 Info NetworkInputHandler.cpp:668: applyAllTickClosures: applying tickClosure(tick(1797322) inputActions((PlayerLeaveGame) (OpenCharacterGui) (SelectedEntityCleared) (StopRepair) ) ) for peer(1)
90.754 Info NetworkInputHandler.cpp:527: expectedMapTick(-1) removing peer(1) success(true).
90.754 Info GameActionHandler.cpp:1967: MapTick(1797337) processed PlayerLeaveGame peerID(1) playerIndex(1)
90.754 Verbose NetworkInputHandler.cpp:559: expectedMapTick(-1) NetworkTick(4801) lastTickApplied(1797336) tickCloseFailuresCount(0) dumping tickclosure queues ...
90.754 Verbose NetworkInputHandler.cpp:569: peer(0) playerIndex(65535) tickClosures()
90.754 Info MultiplayerManager.cpp:1740: maptick(1797337) crc after applying all ticks: -2433433
90.754 Info MultiplayerManager.cpp:912: networkTick(4801) mapTick(1797337) changing state from(InGameAligning) to(InGameAligned)
Factorio crashed. Generating symbolized stacktrace, please wait ...
c:\cygwin64\tmp\factorio-vbn8ul\libraries\stackwalker\stackwalker.cpp (923): StackWalker::ShowCallstack
c:\cygwin64\tmp\factorio-vbn8ul\src\util\logger.cpp (306): Logger::writeStacktrace
c:\cygwin64\tmp\factorio-vbn8ul\src\util\logger.cpp (360): Logger::logStacktrace
c:\cygwin64\tmp\factorio-vbn8ul\src\util\crashhandler.cpp (84): CrashHandler::writeStackTrace
c:\cygwin64\tmp\factorio-vbn8ul\src\util\crashhandler.cpp (174): CrashHandler::SignalHandler
f:\dd\vctools\crt\crtw32\misc\winxfltr.c (372): _XcptFilter
f:\dd\vctools\crt\crtw32\startup\threadex.c (378): _callthreadstartex$filt$0
f:\dd\vctools\crt\crtw32\misc\amd64\chandler.c (162): __C_specific_handler
ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 00007FFF9E7E9AED)
00007FFF9E7E9AED (ntdll): (filename not available): _chkstk
ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 00007FFF9E774FE9)
00007FFF9E774FE9 (ntdll): (filename not available): RtlImageNtHeaderEx
ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 00007FFF9E7E8BFA)
00007FFF9E7E8BFA (ntdll): (filename not available): KiUserExceptionDispatcher
c:\cygwin64\tmp\factorio-vbn8ul\src\surface\surface.cpp (309): Surface::findNearestEnemy
c:\cygwin64\tmp\factorio-vbn8ul\src\entity\character.cpp (1600): Character::getShootingTarget
c:\cygwin64\tmp\factorio-vbn8ul\src\graphics\cursorrenderer.cpp (116): CursorRenderer::renderPlayerCursor
c:\cygwin64\tmp\factorio-vbn8ul\src\graphics\cursorrenderer.cpp (58): CursorRenderer::prepare
c:\cygwin64\tmp\factorio-vbn8ul\src\graphics\gamerenderer.cpp (120): GameRenderer::prepareJob
c:\cygwin64\tmp\factorio-vbn8ul\src\gameview.cpp (774): GameView::prepareRender
c:\cygwin64\tmp\factorio-vbn8ul\src\game.cpp (256): Game::prepareRender
c:\cygwin64\tmp\factorio-vbn8ul\src\mainloop.cpp (221): MainLoop::prepare
c:\cygwin64\tmp\factorio-vbn8ul\src\mainloop.cpp (473): MainLoop::tickStep
c:\cygwin64\tmp\factorio-vbn8ul\src\mainloop.cpp (576): MainLoop::run
c:\cygwin64\tmp\factorio-vbn8ul\src\main.cpp (493): wmain
f:\dd\vctools\crt\crtw32\startup\crt0.c (255): __tmainCRTStartup
ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 00007FFF9BC28102)
00007FFF9BC28102 (KERNEL32): (filename not available): BaseThreadInitThunk
ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 00007FFF9E79C5B4)
00007FFF9E79C5B4 (ntdll): (filename not available): RtlUserThreadStart
93.007 Error Util.cpp:78: Unexpected error occurred. You can help us to solve the problem by posting the contents of the log file on the Factorio forums.

Rseding91
Factorio Staff
Factorio Staff
Posts: 13204
Joined: Wed Jun 11, 2014 5:23 am
Contact:

Re: [0.12] Headless mode and multiple clients behind NAT

Post by Rseding91 »

defty wrote:headless server 12.9 2nd user wants to join gets error

error from game hanging but look close and see why internal user can't connect together with external user
seperate connection possible but when en other user is trying to join it won't allow it.
Please try updating to the latest version of the game where this issue should be resolved. Currently that's version 0.12.30.
If you want to get ahold of me I'm almost always on Discord.

Post Reply

Return to “Resolved Problems and Bugs”