From b77cf95e875434d80177478133bc9e7b0ae7580a Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Wed, 5 Nov 2025 15:52:34 +0300 Subject: [PATCH] fixed for new libusefull_macros --- Network_CAN_clientserver/CMakeLists.txt | 8 +++--- Network_CAN_clientserver/clientserver.c | 33 +++++++++++++++++++------ Network_CAN_clientserver/clientserver.h | 1 + Network_CAN_clientserver/main.c | 20 ++++----------- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/Network_CAN_clientserver/CMakeLists.txt b/Network_CAN_clientserver/CMakeLists.txt index a384936..01ed9c3 100644 --- a/Network_CAN_clientserver/CMakeLists.txt +++ b/Network_CAN_clientserver/CMakeLists.txt @@ -11,7 +11,7 @@ message("VERSION: ${VERSION}") # list of options option(DEBUG "Compile in debug mode" OFF) -option(EXAMPLES "Compile also all examples" ON) +#option(EXAMPLES "Compile also all examples" ON) # default flags set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -Wextra -std=gnu99") @@ -68,6 +68,6 @@ include(GNUInstallDirs) install(TARGETS ${PROJ} DESTINATION "bin") # EXAMPLES -if(EXAMPLES) - add_subdirectory(examples) -endif() +#if(EXAMPLES) +# add_subdirectory(examples) +#endif() diff --git a/Network_CAN_clientserver/clientserver.c b/Network_CAN_clientserver/clientserver.c index 218349e..0eaa286 100644 --- a/Network_CAN_clientserver/clientserver.c +++ b/Network_CAN_clientserver/clientserver.c @@ -26,7 +26,7 @@ #include "parsecanmsgs.h" static pthread_t clientthread; -sl_sock_t *serialsock = NULL; +static sl_sock_t *serialsock = NULL, *serversock = NULL; #define CMDIN "in" #define CMDOUT "out" @@ -56,6 +56,11 @@ static commands allcommands[] = { {NULL, 0, 0} }; +void killsockets(){ + if(serialsock) sl_sock_delete(&serialsock); + if(serversock) sl_sock_delete(&serversock); +} + static int Relay1cmds(CAN_message *msg, char buf[BUFSIZ]){ int L = 0; uint16_t cmd = MSGP_GET_CMD(msg); @@ -68,6 +73,7 @@ static int Relay1cmds(CAN_message *msg, char buf[BUFSIZ]){ } if(!c->textcmd) return 0; DBG("found text cmd is %s (%u)", c->textcmd, data); + //L = snprintf(buf, BUFSIZ-1, "%s=%u\n", c->textcmd, data); if(par == NO_PARNO) L = snprintf(buf, BUFSIZ-1, "%s=%u\n", c->textcmd, data); else L = snprintf(buf, BUFSIZ-1, "%s[%d]=%u\n", c->textcmd, par, data); return L; @@ -87,7 +93,7 @@ static void gotCANans(CAN_message *msg){ } if(L < 1) return; DBG("BUF: %s", buf); - int N = sl_sock_sendall((uint8_t*) buf, L); + int N = sl_sock_sendall(serversock, (uint8_t*) buf, L); green("Send to %d clients\n", N); } @@ -204,15 +210,24 @@ static void toomuch(int fd){ LOGWARN("Client fd=%d tried to connect after MAX reached", fd); } // new connections handler -static void connected(sl_sock_t *c){ +static int connected(sl_sock_t *c){ if(c->type == SOCKT_UNIX) LOGMSG("New client fd=%d connected", c->fd); else LOGMSG("New client fd=%d, IP=%s connected", c->fd, c->IP); + // here we can change client's IP and return FALSE to close it + return TRUE; } // disconnected handler static void disconnected(sl_sock_t *c){ if(c->type == SOCKT_UNIX) LOGMSG("Disconnected client fd=%d", c->fd); else LOGMSG("Disconnected client fd=%d, IP=%s", c->fd, c->IP); } +static sl_sock_hresult_e defhandler(struct sl_sock *s, const char *str){ + if(!s || !str) return RESULT_FAIL; + sl_sock_sendstrmessage(s, "You entered wrong command:\n```\n"); + sl_sock_sendstrmessage(s, str); + sl_sock_sendstrmessage(s, "\n```\nTry \"help\"\n"); + return RESULT_SILENCE; +} static sl_sock_hitem_t handlers[] = { {dtimeh, "dtime", "get server's UNIX time for all clients connected", NULL}, @@ -228,13 +243,17 @@ static sl_sock_hitem_t handlers[] = { }; sl_sock_t *RunSrv(sl_socktype_e type, const char *node){ - sl_sock_maxclhandler(toomuch); - sl_sock_connhandler(connected); - sl_sock_dischandler(disconnected); - return sl_sock_run_server(type, node, 4096, handlers); + serversock = sl_sock_run_server(type, node, 4096, handlers); + if(!serversock) return NULL; + sl_sock_maxclhandler(serversock, toomuch); + sl_sock_connhandler(serversock, connected); + sl_sock_dischandler(serversock, disconnected); + sl_sock_defmsghandler(serversock, defhandler); + return serversock; } sl_sock_t *RunClt(sl_socktype_e type, const char *node){ + DBG("run client type %d node %s", type, node); serialsock = sl_sock_run_client(type, node, 4096); if(!serialsock){ DBG("Can't run client"); diff --git a/Network_CAN_clientserver/clientserver.h b/Network_CAN_clientserver/clientserver.h index 6663b92..31d4749 100644 --- a/Network_CAN_clientserver/clientserver.h +++ b/Network_CAN_clientserver/clientserver.h @@ -22,3 +22,4 @@ sl_sock_t *RunSrv(sl_socktype_e type, const char *node); sl_sock_t *RunClt(sl_socktype_e type, const char *node); +void killsockets(); diff --git a/Network_CAN_clientserver/main.c b/Network_CAN_clientserver/main.c index 0a13a47..e24cb7d 100644 --- a/Network_CAN_clientserver/main.c +++ b/Network_CAN_clientserver/main.c @@ -23,22 +23,13 @@ #include "clientserver.h" #include "globopts.h" -static sl_sock_t *srv = NULL, *clt = NULL; - void signals(int sig){ if(sig){ signal(sig, SIG_IGN); DBG("Get signal %d, quit.\n", sig); LOGERR("Exit with status %d", sig); }else LOGERR("Exit"); - if(srv){ - DBG("Del server"); - sl_sock_delete(&srv); - } - if(clt){ - DBG("Del client"); - sl_sock_delete(&clt); - } + killsockets(); exit(sig); } @@ -49,12 +40,12 @@ int main(int argc, char **argv){ if(!UserOpts.srvnode) ERRX("Point server node"); if(!UserOpts.cltnode) ERRX("Point serial client node"); sl_socktype_e type = (UserOpts.srvunix) ? SOCKT_UNIX : SOCKT_NET; - sl_sock_changemaxclients(UserOpts.maxclients); - srv = RunSrv(type, UserOpts.srvnode); + sl_sock_t *srv = RunSrv(type, UserOpts.srvnode); if(!srv) ERRX("Server: can't create socket and/or run threads"); + sl_sock_changemaxclients(srv, UserOpts.maxclients); DBG("Server done"); type = (UserOpts.cltunix) ? SOCKT_UNIX : SOCKT_NET; - clt = RunClt(type, UserOpts.cltnode); + sl_sock_t *clt = RunClt(type, UserOpts.cltnode); if(!clt) ERRX("Serial client: can't connect to socket and/or run threads"); DBG("Client done"); sl_loglevel_e lvl = UserOpts.verbose + LOGLEVEL_ERR; @@ -75,7 +66,6 @@ int main(int argc, char **argv){ } LOGMSG("End"); DBG("Close"); - if(srv) sl_sock_delete(&srv); - if(clt) sl_sock_delete(&clt); + killsockets(); return 0; }