diff --git a/src/commands.nim b/src/commands.nim index ee9c0ee..8cd3e71 100644 --- a/src/commands.nim +++ b/src/commands.nim @@ -1,4 +1,4 @@ - +import json const defaultPort* = 5555 ## Default port at which the control server will run @@ -12,4 +12,7 @@ type parameter*: string ## Optional parameter for the command proc newCommand*(c: Command, p: string = ""): CommandMessage = - CommandMessage(command: c, parameter: p) \ No newline at end of file + CommandMessage(command: c, parameter: p) + +proc wrap*(msg: CommandMessage): string = + $(%msg) & "\r\L" \ No newline at end of file diff --git a/src/pixctrl.nim b/src/pixctrl.nim index bccf068..55d2d80 100644 --- a/src/pixctrl.nim +++ b/src/pixctrl.nim @@ -2,12 +2,21 @@ import net import argparse import commands +var socket = newSocket() + +proc sendCommand(server, port: string, msg: CommandMessage) = + socket.connect(server, Port(port.parseInt)) + if not socket.trySend(msg.wrap): + echo "Cannot send command: ", msg + socket.close() + var p = newParser("pixctrl"): help("Control utilitiy for randopix") option("-s", "--server", help="Host running the randopix server", default="127.0.0.1") option("-p", "--port", help="Port to connect to the randopix server", default = $defaultPort) - -var socket = newSocket() -socket.connect("127.0.0.1", Port(defaultPort)) -socket.send("Hello, Sockets!\r\L") -socket.close() \ No newline at end of file + command("refresh"): + run: + let c = newCommand(Command.Refresh) + sendCommand(opts.parentOpts.server, opts.parentOpts.port, c) + +p.run(commandLineParams()) \ No newline at end of file diff --git a/src/randopix.nim b/src/randopix.nim index 8a7088d..b54277a 100644 --- a/src/randopix.nim +++ b/src/randopix.nim @@ -129,6 +129,7 @@ proc checkServerChannel(parameter: string): bool = else: echo "Command ignored", msg.command + sleep(100) result = false discard idleAdd(checkServerChannel, parameter) diff --git a/src/server.nim b/src/server.nim index 3d37d8c..b54cac5 100644 --- a/src/server.nim +++ b/src/server.nim @@ -1,4 +1,4 @@ -import net, json, marshal +import net, json import commands var @@ -9,23 +9,28 @@ proc closeServer*() = var socket = newSocket() socket.connect("127.0.0.1", Port(defaultPort)) let c = newCommand(Command.Close) - socket.send($(%c)) + socket.send(c.wrap) socket.close() proc runServer*() = - var socket = newSocket() - socket.bindAddr(Port(defaultPort)) - socket.listen() + var server = newSocket() + server.bindAddr(Port(defaultPort)) + server.listen() echo "Control server is listening" while true: # Process client requests var client = newSocket() - socket.accept(client) - echo("Incomming client") + server.accept(client) + echo("Client connected") try: var line = client.recvLine() - let msg = to[CommandMessage](line) + if line == "": + echo "No data from client" + continue + + var jsonData = parseJson(line) + let msg = jsonData.to(CommandMessage) case msg.command of Command.Close: echo "Server recieved termination command. Exiting." @@ -37,4 +42,6 @@ proc runServer*() = except OSError: echo "Server error: ", getCurrentExceptionMsg() except: - echo "Invalid command from client" \ No newline at end of file + echo "Invalid command from client: ", getCurrentExceptionMsg() + echo repr(getCurrentException()) + server.close() \ No newline at end of file