Refactor server tunnel initialization
Start the server socket in enable_tunnel() directly.
For the caller point of view, enabling the tunnel opens a port (either
the server socket locally or the "adb forward" process).
@@ -143,9 +143,24 @@ listen_on_port(uint16_t port) {
static bool
enable_tunnel(struct server *server) {
if (enable_tunnel_reverse(server->serial, server->local_port)) {
+ // At the application level, the device part is "the server" because it
+ // serves video stream and control. However, at the network level, the
+ // client listens and the server connects to the client. That way, the
+ // client can listen before starting the server app, so there is no
+ // need to try to connect until the server socket is listening on the
+ // device.
+ server->server_socket = listen_on_port(server->local_port);
+ if (server->server_socket == INVALID_SOCKET) {
+ LOGE("Could not listen on port %" PRIu16, server->local_port);
+ disable_tunnel(server);
+ return false;
+ }
+
return true;
}
+ // if "adb reverse" does not work (e.g. over "adb connect"), it fallbacks to
+ // "adb forward", so the app socket is the client
LOGW("'adb reverse' failed, fallback to 'adb forward'");
server->tunnel_forward = true;
return enable_tunnel_forward(server->serial, server->local_port);
@@ -265,25 +280,6 @@ server_start(struct server *server, const char *serial,
return false;
}
- // if "adb reverse" does not work (e.g. over "adb connect"), it fallbacks to
- // "adb forward", so the app socket is the client
- if (!server->tunnel_forward) {
- // At the application level, the device part is "the server" because it
- // serves video stream and control. However, at the network level, the
- // client listens and the server connects to the client. That way, the
- // client can listen before starting the server app, so there is no
- // need to try to connect until the server socket is listening on the
- // device.
-
- server->server_socket = listen_on_port(params->local_port);
- if (server->server_socket == INVALID_SOCKET) {
- LOGE("Could not listen on port %" PRIu16, params->local_port);
- disable_tunnel(server);
- SDL_free(server->serial);
- return false;
- }
- }
-
// server will connect to our server socket
server->process = execute_server(server, params);
