I have a super simple embedded server. But running...
# ktor
s
I have a super simple embedded server. But running it on an iOS simulator I frequently get
PosixException.AddressAlreadyInUseException: EADDRINUSE (48): Address already in use
Does anyone know if there's a way of registering an uncaught exception handler to the Ktor server so I can handle this gracefully. (Or a proper fix would be welcome). I've tried wrapping the whole thing in a coroutine scope launch block with a coroutine exception handler but that doesn't work.
Copy code
embeddedServer(CIO, port = 8080) {
        routing {
            get("/") {
                call.respondText("Hello, world!")
            }
        }
}.start(wait = true)
e
if you use
port = 0
, it should automatically choose a free port. after it is started, you can find what port it ended up on through
.resolvedConnectors()
s
Ah that should allow me to come up with a work around. Thanks! Don't suppose you know how to catch that exception though?
e
does a normal
try
-
catch
around
.start()
not work? (I don't know if there's any iOS-specific oddities there)
s
Sadly not. There's something strange happening, once I've patched this pretty critical issue I'll come up with a minimal reproducible example. What seems to happen is that I can catch and log the exception, but for some reason it also crashes the app. So I think what's happening is that it's somehow being thrown from multiple places
e
the other solution would typically be to use the
SO_REUSEADDR
socket option (see https://stackoverflow.com/a/2270357 for explanation) but it doesn't look like
embeddedServer
has any way to customize how the server socket is bound 😞
s
Yeah I came to the same conclusion, do you know if it's possible to reproduce the
embeddedServer
behaviour at a lower level to access this api? From what I can see it only seems to be exposed to JVM? (If you don't know off the top of your head that's cool, just wondering)
(Also @ephemient you've saved my skin with that
port=0
trick, thank you so much ❤️ )
e
I suppose you could re-implement most of the
embeddedServer
behavior, I don't think it's using anything internal… but it looks like a pain :(
luckily the
port=0
trick is a fairly common use of the socket API, it's not just a ktor thing
s
Did not know that, noted! Yeah pain was my conclusion too, I think I might have to try, thanks for your help!
e
FYI this is now possible in KTOR 2.3.0:
Copy code
embeddedServer(CIO, port = 8080, configure = { reuseAddress = true }) {
s
I've been following the PR too! Thanks for the heads up tho!