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.
This commit is contained in:
Romain Vimont 2021-12-06 21:50:24 +01:00
parent 80fe12a95f
commit cabcbc2b15
3 changed files with 51 additions and 32 deletions

View file

@ -388,6 +388,7 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) {
assert(tunnel->enabled); assert(tunnel->enabled);
const char *serial = server->params.serial; const char *serial = server->params.serial;
bool control = server->params.control;
sc_socket video_socket = SC_SOCKET_NONE; sc_socket video_socket = SC_SOCKET_NONE;
sc_socket control_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; goto fail;
} }
control_socket = net_accept_intr(&server->intr, tunnel->server_socket); if (control) {
if (control_socket == SC_SOCKET_NONE) { control_socket =
goto fail; net_accept_intr(&server->intr, tunnel->server_socket);
if (control_socket == SC_SOCKET_NONE) {
goto fail;
}
} }
} else { } else {
uint32_t tunnel_host = server->params.tunnel_host; 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; goto fail;
} }
// we know that the device is listening, we don't need several attempts if (control) {
control_socket = net_socket(); // we know that the device is listening, we don't need several
if (control_socket == SC_SOCKET_NONE) { // attempts
goto fail; control_socket = net_socket();
} if (control_socket == SC_SOCKET_NONE) {
bool ok = net_connect_intr(&server->intr, control_socket, tunnel_host, goto fail;
tunnel_port); }
if (!ok) { bool ok = net_connect_intr(&server->intr, control_socket,
goto fail; 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(video_socket != SC_SOCKET_NONE);
assert(control_socket != SC_SOCKET_NONE); assert(!control || control_socket != SC_SOCKET_NONE);
server->video_socket = video_socket; server->video_socket = video_socket;
server->control_socket = control_socket; server->control_socket = control_socket;

View file

@ -30,8 +30,13 @@ public final class DesktopConnection implements Closeable {
private DesktopConnection(LocalSocket videoSocket, LocalSocket controlSocket) throws IOException { private DesktopConnection(LocalSocket videoSocket, LocalSocket controlSocket) throws IOException {
this.videoSocket = videoSocket; this.videoSocket = videoSocket;
this.controlSocket = controlSocket; this.controlSocket = controlSocket;
controlInputStream = controlSocket.getInputStream(); if (controlSocket != null) {
controlOutputStream = controlSocket.getOutputStream(); controlInputStream = controlSocket.getInputStream();
controlOutputStream = controlSocket.getOutputStream();
} else {
controlInputStream = null;
controlOutputStream = null;
}
videoFd = videoSocket.getFileDescriptor(); videoFd = videoSocket.getFileDescriptor();
} }
@ -41,31 +46,35 @@ public final class DesktopConnection implements Closeable {
return localSocket; 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 videoSocket;
LocalSocket controlSocket; LocalSocket controlSocket = null;
if (tunnelForward) { if (tunnelForward) {
LocalServerSocket localServerSocket = new LocalServerSocket(SOCKET_NAME); LocalServerSocket localServerSocket = new LocalServerSocket(SOCKET_NAME);
try { try {
videoSocket = localServerSocket.accept(); videoSocket = localServerSocket.accept();
// send one byte so the client may read() to detect a connection error // send one byte so the client may read() to detect a connection error
videoSocket.getOutputStream().write(0); videoSocket.getOutputStream().write(0);
try { if (control) {
controlSocket = localServerSocket.accept(); try {
} catch (IOException | RuntimeException e) { controlSocket = localServerSocket.accept();
videoSocket.close(); } catch (IOException | RuntimeException e) {
throw e; videoSocket.close();
throw e;
}
} }
} finally { } finally {
localServerSocket.close(); localServerSocket.close();
} }
} else { } else {
videoSocket = connect(SOCKET_NAME); videoSocket = connect(SOCKET_NAME);
try { if (control) {
controlSocket = connect(SOCKET_NAME); try {
} catch (IOException | RuntimeException e) { controlSocket = connect(SOCKET_NAME);
videoSocket.close(); } catch (IOException | RuntimeException e) {
throw e; videoSocket.close();
throw e;
}
} }
} }
@ -79,9 +88,11 @@ public final class DesktopConnection implements Closeable {
videoSocket.shutdownInput(); videoSocket.shutdownInput();
videoSocket.shutdownOutput(); videoSocket.shutdownOutput();
videoSocket.close(); videoSocket.close();
controlSocket.shutdownInput(); if (controlSocket != null) {
controlSocket.shutdownOutput(); controlSocket.shutdownInput();
controlSocket.close(); controlSocket.shutdownOutput();
controlSocket.close();
}
} }
private void send(String deviceName, int width, int height) throws IOException { private void send(String deviceName, int width, int height) throws IOException {

View file

@ -66,14 +66,15 @@ public final class Server {
Thread initThread = startInitThread(options); Thread initThread = startInitThread(options);
boolean tunnelForward = options.isTunnelForward(); 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, ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate(), options.getMaxFps(), codecOptions,
options.getEncoderName()); options.getEncoderName());
Thread controllerThread = null; Thread controllerThread = null;
Thread deviceMessageSenderThread = null; Thread deviceMessageSenderThread = null;
if (options.getControl()) { if (control) {
final Controller controller = new Controller(device, connection, options.getClipboardAutosync()); final Controller controller = new Controller(device, connection, options.getClipboardAutosync());
// asynchronous // asynchronous