Skip to content

Commit

Permalink
add heartbeat to ws_thread
Browse files Browse the repository at this point in the history
Signed-off-by: staylightblow8 <[email protected]>
  • Loading branch information
liudf0716 committed Feb 26, 2024
1 parent 4d54dc8 commit 2db6821
Showing 1 changed file with 43 additions and 8 deletions.
51 changes: 43 additions & 8 deletions src/ws_thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,14 @@ ws_request(struct bufferevent* b_ws)
evbuffer_add_printf(out, "\r\n");
}

static void
ws_heartbeat_cb(evutil_socket_t fd, short event, void *arg)
{
struct bufferevent *b_ws = (struct bufferevent *)arg;
struct evbuffer *out = bufferevent_get_output(b_ws);
evbuffer_add_printf(out, "ping");
}

static void
ws_read_cb(struct bufferevent *b_ws, void *ctx)
{
Expand Down Expand Up @@ -250,6 +258,13 @@ ws_read_cb(struct bufferevent *b_ws, void *ctx)
config_get_config()->gw_id);
ws_send(bufferevent_get_output(b_ws), jdata, strlen(jdata));
debug(LOG_DEBUG, "send connect data %s\n", jdata);

// add timer to send heartbeat
struct timeval tv;
tv.tv_sec = 60;
tv.tv_usec = 0;
struct event *ev = event_new(ws_base, -1, EV_PERSIST, ws_heartbeat_cb, b_ws);
event_add(ev, &tv);
} else {
ws_receive(data, pos);
}
Expand All @@ -265,19 +280,26 @@ wsevent_connection_cb(struct bufferevent* b_ws, short events, void *ctx){
debug(LOG_ERR, "ws connection error: %s\n", strerror(errno));
sleep(1);
// reconnect ws server
bufferevent_free(b_ws);
if (b_ws != NULL) {
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();
int ret = 0;
if (!auth_server->authserv_use_ssl) {
bufferevent_socket_connect_hostname(b_ws, ws_dnsbase, AF_INET,
ret = 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,
ret = bufferevent_socket_connect_hostname(b_ws, ws_dnsbase, AF_INET,
auth_server->authserv_hostname, auth_server->authserv_ssl_port);
}
upgraded = false;
if (ret < 0) {
debug(LOG_ERR, "ws connection error: %s\n", strerror(errno));
bufferevent_free(b_ws);
}
}
}

Expand All @@ -292,21 +314,34 @@ start_ws_thread(void *arg)
ws_dnsbase = evdns_base_new(ws_base, 1);

struct bufferevent *ws_bev = bufferevent_socket_new(ws_base, -1, BEV_OPT_CLOSE_ON_FREE|BEV_OPT_DEFER_CALLBACKS);

if (ws_bev == NULL) {
debug(LOG_ERR, "create bufferevent failed\n");
goto ERR;
}
bufferevent_setcb(ws_bev, ws_read_cb, NULL, wsevent_connection_cb, NULL);
bufferevent_enable(ws_bev, EV_READ|EV_WRITE);

int ret = 0
if (!auth_server->authserv_use_ssl) {
bufferevent_socket_connect_hostname(ws_bev, ws_dnsbase, AF_INET,
ret = bufferevent_socket_connect_hostname(ws_bev, ws_dnsbase, AF_INET,
auth_server->authserv_hostname, auth_server->authserv_http_port);
} else {
bufferevent_socket_connect_hostname(ws_bev, ws_dnsbase, AF_INET,
ret = bufferevent_socket_connect_hostname(ws_bev, ws_dnsbase, AF_INET,
auth_server->authserv_hostname, auth_server->authserv_ssl_port);
}


if (ret < 0) {
debug(LOG_ERR, "ws connection error: %s\n", strerror(errno));
bufferevent_free(ws_bev);
goto ERR;
}

event_base_dispatch(ws_base);

event_base_free(ws_base);
ERR:
if (ws_base) event_base_free(ws_base);
if (ws_dnsbase) evdns_base_free(ws_dnsbase, 0);
if (ws_bev) bufferevent_free(ws_bev);

return;
}
Expand Down

0 comments on commit 2db6821

Please sign in to comment.