From 7f34d777240bdaef25434f3e0c20df7a6de46be3 Mon Sep 17 00:00:00 2001 From: staylightblow8 Date: Mon, 26 Feb 2024 11:27:45 +0800 Subject: [PATCH] when ws fail or disconnect, reconnect it Signed-off-by: staylightblow8 --- src/dhcp_cpi.c | 2 +- src/ws_thread.c | 22 +++++++++++++++++----- src/ws_thread.h | 13 +++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/dhcp_cpi.c b/src/dhcp_cpi.c index 495fb48db..d200b2a48 100644 --- a/src/dhcp_cpi.c +++ b/src/dhcp_cpi.c @@ -260,7 +260,7 @@ void thread_dhcp_cpi(const void *arg) } if (nfq_unbind_pf(nfq, AF_INET) < 0) { - debug (LOG_ERR, " nfq_unbind_pf failed"); + debug (LOG_ERR, " nfq_unbind_pf failed: %s", strerror(errno)); nfq_close(nfq); return; } diff --git a/src/ws_thread.c b/src/ws_thread.c index 26177ba43..291629066 100644 --- a/src/ws_thread.c +++ b/src/ws_thread.c @@ -149,10 +149,6 @@ ws_receive(char *data, const size_t data_len){ if(data_len < 2) return; - char temp[20] = {0}; - strncpy(temp, data, data_len>=20?20:data_len); - debug(LOG_DEBUG, "first 3 char of data is %x %x %x\n", data[0], data[1], data[2]); - debug(LOG_DEBUG, "first 20 %s", temp); int fin = !!(*data & 0x80); int opcode = *data & 0x0F; int mask = !!(*(data+1) & 0x80); @@ -265,7 +261,23 @@ wsevent_connection_cb(struct bufferevent* b_ws, short events, void *ctx){ debug (LOG_DEBUG,"connect ws server and start web socket request\n"); ws_request(b_ws); return; - } + } else if(events & (BEV_EVENT_ERROR|BEV_EVENT_EOF)){ + debug(LOG_ERR, "ws connection error: %s\n", strerror(errno)); + // reconnect ws server + bufferevent_free(b_ws); + b_ws = bufferevent_socket_new(ws_base, -1, BEV_OPT_CLOSE_ON_FREE|BEV_OPT_DEFER_CALLBACKS); + bufferevent_setcb(b_ws, ws_read_cb, NULL, wsevent_connection_cb, NULL); + bufferevent_enable(b_ws, EV_READ|EV_WRITE); + t_auth_serv *auth_server = get_auth_server(); + if (!auth_server->authserv_use_ssl) { + bufferevent_socket_connect_hostname(b_ws, ws_dnsbase, AF_INET, + auth_server->authserv_hostname, auth_server->authserv_http_port); + } else { + bufferevent_socket_connect_hostname(b_ws, ws_dnsbase, AF_INET, + auth_server->authserv_hostname, auth_server->authserv_ssl_port); + } + upgraded = false; + } } /* diff --git a/src/ws_thread.h b/src/ws_thread.h index 5c173e487..4e41b7d87 100644 --- a/src/ws_thread.h +++ b/src/ws_thread.h @@ -22,6 +22,19 @@ #ifndef _WS_THREAD_H_ #define _WS_THREAD_H_ +#include + +struct ws_header { + uint8_t fin; // Final fragment flag + uint8_t rsv1; // Reserved flag 1 + uint8_t rsv2; // Reserved flag 2 + uint8_t rsv3; // Reserved flag 3 + uint8_t opcode; // Opcode + uint8_t mask; // Masking flag + uint64_t payload_length; // Payload length + uint8_t masking_key[4]; // Masking key +}; + void start_ws_thread(void *arg); void stop_ws_thread();