From cabcbc2b151255b49a442a1c43e7db44432eb58e Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Mon, 6 Dec 2021 21:50:24 +0100 Subject: [PATCH] Do not create control socket if no control If --no-control is enabled, then it is not necessary to create a second communication socket between the client and the server. This also facilitates the use of the server alone (without the client) to receive only the raw video stream. --- app/src/server.c | 33 ++++++++------ .../genymobile/scrcpy/DesktopConnection.java | 45 ++++++++++++------- .../java/com/genymobile/scrcpy/Server.java | 5 ++- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/app/src/server.c b/app/src/server.c index 06cb7b72..8453f959 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -388,6 +388,7 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) { assert(tunnel->enabled); const char *serial = server->params.serial; + bool control = server->params.control; sc_socket video_socket = SC_SOCKET_NONE; sc_socket control_socket = SC_SOCKET_NONE; @@ -397,9 +398,12 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) { goto fail; } - control_socket = net_accept_intr(&server->intr, tunnel->server_socket); - if (control_socket == SC_SOCKET_NONE) { - goto fail; + if (control) { + control_socket = + net_accept_intr(&server->intr, tunnel->server_socket); + if (control_socket == SC_SOCKET_NONE) { + goto fail; + } } } else { uint32_t tunnel_host = server->params.tunnel_host; @@ -420,15 +424,18 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) { goto fail; } - // we know that the device is listening, we don't need several attempts - control_socket = net_socket(); - if (control_socket == SC_SOCKET_NONE) { - goto fail; - } - bool ok = net_connect_intr(&server->intr, control_socket, tunnel_host, - tunnel_port); - if (!ok) { - goto fail; + if (control) { + // we know that the device is listening, we don't need several + // attempts + control_socket = net_socket(); + if (control_socket == SC_SOCKET_NONE) { + goto fail; + } + bool ok = net_connect_intr(&server->intr, control_socket, + tunnel_host, tunnel_port); + if (!ok) { + goto fail; + } } } @@ -442,7 +449,7 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) { } assert(video_socket != SC_SOCKET_NONE); - assert(control_socket != SC_SOCKET_NONE); + assert(!control || control_socket != SC_SOCKET_NONE); server->video_socket = video_socket; server->control_socket = control_socket; diff --git a/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java b/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java index 0ec43040..40cb088c 100644 --- a/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java +++ b/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java @@ -30,8 +30,13 @@ public final class DesktopConnection implements Closeable { private DesktopConnection(LocalSocket videoSocket, LocalSocket controlSocket) throws IOException { this.videoSocket = videoSocket; this.controlSocket = controlSocket; - controlInputStream = controlSocket.getInputStream(); - controlOutputStream = controlSocket.getOutputStream(); + if (controlSocket != null) { + controlInputStream = controlSocket.getInputStream(); + controlOutputStream = controlSocket.getOutputStream(); + } else { + controlInputStream = null; + controlOutputStream = null; + } videoFd = videoSocket.getFileDescriptor(); } @@ -41,31 +46,35 @@ public final class DesktopConnection implements Closeable { return localSocket; } - public static DesktopConnection open(Device device, boolean tunnelForward) throws IOException { + public static DesktopConnection open(Device device, boolean tunnelForward, boolean control) throws IOException { LocalSocket videoSocket; - LocalSocket controlSocket; + LocalSocket controlSocket = null; if (tunnelForward) { LocalServerSocket localServerSocket = new LocalServerSocket(SOCKET_NAME); try { videoSocket = localServerSocket.accept(); // send one byte so the client may read() to detect a connection error videoSocket.getOutputStream().write(0); - try { - controlSocket = localServerSocket.accept(); - } catch (IOException | RuntimeException e) { - videoSocket.close(); - throw e; + if (control) { + try { + controlSocket = localServerSocket.accept(); + } catch (IOException | RuntimeException e) { + videoSocket.close(); + throw e; + } } } finally { localServerSocket.close(); } } else { videoSocket = connect(SOCKET_NAME); - try { - controlSocket = connect(SOCKET_NAME); - } catch (IOException | RuntimeException e) { - videoSocket.close(); - throw e; + if (control) { + try { + controlSocket = connect(SOCKET_NAME); + } catch (IOException | RuntimeException e) { + videoSocket.close(); + throw e; + } } } @@ -79,9 +88,11 @@ public final class DesktopConnection implements Closeable { videoSocket.shutdownInput(); videoSocket.shutdownOutput(); videoSocket.close(); - controlSocket.shutdownInput(); - controlSocket.shutdownOutput(); - controlSocket.close(); + if (controlSocket != null) { + controlSocket.shutdownInput(); + controlSocket.shutdownOutput(); + controlSocket.close(); + } } private void send(String deviceName, int width, int height) throws IOException { diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index fc31dada..4f9575ae 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -66,14 +66,15 @@ public final class Server { Thread initThread = startInitThread(options); boolean tunnelForward = options.isTunnelForward(); + boolean control = options.getControl(); - try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) { + try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward, control)) { ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate(), options.getMaxFps(), codecOptions, options.getEncoderName()); Thread controllerThread = null; Thread deviceMessageSenderThread = null; - if (options.getControl()) { + if (control) { final Controller controller = new Controller(device, connection, options.getClipboardAutosync()); // asynchronous