From b74ad5954607d34e939f9cf32876bd7ba65998f9 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Thu, 11 Apr 2024 13:08:05 +0800
Subject: [PATCH] Update socket example project
---
project/socketd/booster/proc.c | 2
project/socketd/booster/socket.h | 12 ++++--
project/socketd/sock_client.c | 26 ++++--------
project/socketd/booster/socket.c | 68 +++++++++++++++++++++++----------
4 files changed, 65 insertions(+), 43 deletions(-)
diff --git a/project/socketd/booster/proc.c b/project/socketd/booster/proc.c
index 3fa8907..b55b202 100644
--- a/project/socketd/booster/proc.c
+++ b/project/socketd/booster/proc.c
@@ -357,7 +357,7 @@
* *****************************************************************************/
int set_daemon_running(const char *pid_file)
{
- daemonize(0, 1);
+ daemon(0, 1);
log_info("Program running as daemon [PID:%d].\n", getpid());
if (record_daemon_pid(pid_file) < 0)
diff --git a/project/socketd/booster/socket.c b/project/socketd/booster/socket.c
index 0206bb9..4049bfc 100644
--- a/project/socketd/booster/socket.c
+++ b/project/socketd/booster/socket.c
@@ -69,6 +69,7 @@
{
close(sock->fd);
sock->fd = -1;
+ sock->connected = 0;
}
return 0;
@@ -92,6 +93,52 @@
set_socket_rlimit(); /* set max open socket count */
}
#endif
+
+/* description: check socket connect status
+ * input args:
+ * $sock: socket context pointer
+ * return value: 1: connected 0:disconnected
+ */
+int socket_connected(socket_ctx_t *sock)
+{
+ struct tcp_info info;
+ int len=sizeof(info);
+ int changed = 0;
+
+ if( !sock )
+ {
+ return 0;
+ }
+
+ if( sock->fd < 0 )
+ {
+ /* socket is connected before but got disconnected now */
+ changed = sock->connected ? 1 : 0;
+ sock->connected = 0;
+ goto out;
+ }
+
+ getsockopt(sock->fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
+ if( TCP_ESTABLISHED==info.tcpi_state )
+ {
+ /* socket is disconnected before but got connected now */
+ changed = !sock->connected ? 1 : 0;
+ sock->connected = 1;
+ }
+ else
+ {
+ /* socket is connected before but got disconnected now */
+ changed = sock->connected ? 1 : 0;
+ sock->connected = 0;
+ }
+
+out:
+ if( changed )
+ {
+ log_info("socket status got %s\n", sock->connected?"connected":"disconnected");
+ }
+ return sock->connected;
+}
/* description: socket connect to server in block mode
* input args:
@@ -288,30 +335,9 @@
}
-
/*+-------------------------------------------------------------------+
*| socket utils function |
*+-------------------------------------------------------------------+*/
-
-
-/* socket connected or not: <0: failure 0:ok */
-int sock_check_connect(int sockfd)
-{
- struct tcp_info info;
- int len=sizeof(info);
-
- if( sockfd < 0 )
- return -1;
-
- getsockopt(sockfd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
-
- if( TCP_CLOSE==info.tcpi_state || TCP_CLOSING==info.tcpi_state || TCP_CLOSE_WAIT==info.tcpi_state )
- {
- return -3;
- }
-
- return -0;
-}
/* description: set socket listen port as reusable, fix port already used bug */
int socket_set_reuseaddr(int sockfd)
diff --git a/project/socketd/booster/socket.h b/project/socketd/booster/socket.h
index f0c5fb4..dc41d69 100644
--- a/project/socketd/booster/socket.h
+++ b/project/socketd/booster/socket.h
@@ -21,6 +21,7 @@
char host[HOSTNAME_LEN]; /* CLIENT: Connect server hostname; SERVER: Unused */
int port; /* CLIENT: Connect server port; SERVER: listen port */
int fd; /* socket descriptor */
+ int connected; /* socket connect status: 1->connected 0->disconnected */
} socket_ctx_t;
/* description: initial socket context
@@ -45,6 +46,13 @@
* return value: <0: failure 0:ok
*/
extern int socket_listen(socket_ctx_t *sock);
+
+/* description: check socket connect status
+ * input args:
+ * $sock: socket context pointer
+ * return value: 1: connected 0:disconnected
+ */
+extern int socket_connected(socket_ctx_t *sock);
/* description: socket client connect to server
* input args:
@@ -76,10 +84,6 @@
/*+-------------------------------------------------------------------+
*| socket utils function |
*+-------------------------------------------------------------------+*/
-
-
-/* socket connected or not: <0: failure 0:ok */
-extern int sock_check_connect(int sockfd);
/* description: set socket listen port as reusable, fix port already used bug */
extern int socket_set_reuseaddr(int sockfd);
diff --git a/project/socketd/sock_client.c b/project/socketd/sock_client.c
index 20f1898..6a594d9 100644
--- a/project/socketd/sock_client.c
+++ b/project/socketd/sock_client.c
@@ -69,7 +69,9 @@
char pack_buf[1024];
int pack_bytes = 0;
pack_info_t pack_info;
- pack_proc_t pack_proc = packet_segmented_pack; /* use string packet */
+ pack_proc_t pack_proc = packet_segmented_pack; /* use segmented string packet */
+ //pack_proc_t pack_proc = packet_json_pack; /* use JSON string packet */
+ //pack_proc_t pack_proc = packet_tlv_pack; /* use TLV(Tag Length Value) packet */
struct option opts[] = {
{"ipaddr", required_argument, NULL, 'i'},
@@ -180,25 +182,15 @@
* +---------------------------------+*/
/* start connect to server if not connected */
- if( sock.fd < 0 )
+ if( !socket_connected(&sock) )
{
socket_connect(&sock);
- }
-
- /* check socket connected or not */
- if( sock_check_connect(sock.fd) < 0 )
- {
- if( sock.fd > 0 )
- {
- log_error("socket got disconnected, terminate it and reconnect now.\n");
- socket_term(&sock); /* close the soket */
- }
}
/* +-------------------------------+
* | socket disconnect |
* +-------------------------------+*/
- if( sock.fd < 0 )
+ if( !socket_connected(&sock) )
{
if( sample_flag )
{
@@ -220,7 +212,7 @@
{
log_warn("socket send sample packet failure, save it in database now.\n");
database_push_packet(pack_buf, pack_bytes);
- socket_term(&sock); /* close the soket */
+ continue;
}
}
@@ -231,7 +223,7 @@
if( socket_send(&sock, pack_buf, pack_bytes) < 0 )
{
log_error("socket send database packet failure");
- socket_term(&sock); /* close the soket */
+ continue;
}
else
{
@@ -240,7 +232,7 @@
}
}
- msleep(50);
+ msleep(5);
}
cleanup:
@@ -259,7 +251,7 @@
time(&now);
- if( now >= *last_time+interval )
+ if( difftime(now, *last_time)>interval )
{
need = 1; /* need sample now */
*last_time = now;
--
Gitblit v1.9.1