From 805b28fc2e633bcd9c823a4b23614378ebfd50a1 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Tue, 12 May 2026 16:52:28 +0800
Subject: [PATCH] update APUE socket project

---
 project/2.socketd/socket_client.c |   87 ++++++++++++++++++++-----------------------
 1 files changed, 41 insertions(+), 46 deletions(-)

diff --git a/project/2.socketd/socket_client.c b/project/2.socketd/socket_client.c
index 3830c28..49ebe78 100644
--- a/project/2.socketd/socket_client.c
+++ b/project/2.socketd/socket_client.c
@@ -27,7 +27,7 @@
 #include "database.h"
 
 #define PROG_VERSION               "v1.0.0"
-#define DAEMON_PIDFILE             "/tmp/.socketc.pid"
+#define DAEMON_PIDFILE             "/tmp/socketc.pid"
 
 static void print_usage(char *progname)
 {
@@ -46,15 +46,15 @@
     return;
 }
 
-int check_sample_time(time_t *last_time, int interval);
-
 int main (int argc, char **argv)
 {
     char               *progname=NULL;
     int                 daemon = 1;
     int                 rv;
+    int                 rowid = 0;
+    time_t              now;
 
-    char               *logfile="sock_client.log";
+    char               *logfile="/tmp/socketc.log";
     int                 loglevel=LOG_LEVEL_INFO;
     int                 logsize=10; /* logfile size max to 10K */
 
@@ -119,7 +119,6 @@
             default:
                 break;
         }
-
     }
 
     if( !serverip || !port )
@@ -128,28 +127,36 @@
         return 0;
     }
 
+    /* initial socket context */
+    socket_init(&sock, serverip, port);
+
     /* open logger system */
     if( log_open(logfile, loglevel, logsize, THREAD_LOCK_NONE) < 0 )
     {
-        fprintf(stderr, "Initial log system failed\n");
+        fprintf(stderr, "Initial logger failed\n");
         return 1;
     }
 
-    /* install signal proc handler */
-    install_default_signal();
-
-    /* check program already running or not, if already running then exit, or set running as daemon */
-    if( check_set_program_running(daemon, DAEMON_PIDFILE) < 0 )
-        goto cleanup;
-
-    log_info("socket client start running.\n");
-
-    if( database_init("sock_client.db") < 0 )
+    /* open database for cache data */
+    if( db_open("sock_client.db") < 0 )
     {
-        return 2;
+        fprintf(stderr, "Initial database failed\n");
+        rv = 2;
+        goto cleanup;
     }
 
-    socket_init(&sock, serverip, port);
+    /* check whether the program is running; if not, start it in the background. */
+    if( check_set_program_running(daemon, DAEMON_PIDFILE) < 0 )
+    {
+        fprintf(stderr, "Program is already running. Exiting.\n");
+        rv = 3;
+        goto cleanup;
+    }
+
+    /* install signal handler */
+    install_default_signal();
+
+    log_info("socket client start running.\n");
 
     while( ! g_signal.stop )
     {
@@ -158,11 +165,10 @@
          * +----------------------------------+*/
 
         sample_flag = 0; /* clear sample flag */
+        time(&now);      /* get current time */
 
-        if( check_sample_time(&last_time, interval) )
+        if( difftime(now, last_time) >= interval )
         {
-            log_debug("start DS18B20 sample termperature\n");
-
             if( (rv=ds18b20_get_temperature(&pack_info.temper)) < 0 )
             {
                 log_error("DS18B20 sample temperature failure, rv=%d\n", rv);
@@ -176,6 +182,7 @@
             pack_bytes = pack_proc(&pack_info, (uint8_t *)pack_buf, sizeof(pack_buf));
             log_dump(LOG_LEVEL_DEBUG, NULL, pack_buf, pack_bytes);
 
+            last_time = now; /* update last sample time */
             sample_flag = 1; /* set sample flag */
         }
 
@@ -184,7 +191,7 @@
          * +---------------------------------+*/
 
         /* start connect to server if not connected */
-        if( !socket_connected(&sock) )
+        if( !socket_check(&sock) )
         {
             socket_connect(&sock);
         }
@@ -192,13 +199,14 @@
         /* +-------------------------------+
          * |      socket disconnect        |
          * +-------------------------------+*/
-        if( !socket_connected(&sock) )
+        if( !sock.connected )
         {
             if( sample_flag )
             {
-                database_push_packet(pack_buf, pack_bytes);
+                db_write(pack_buf, pack_bytes);
             }
 
+            /* Bypass the data send procedure for socket disconnect */
             continue;
         }
 
@@ -213,13 +221,13 @@
             if( socket_send(&sock, pack_buf, pack_bytes) < 0 )
             {
                 log_warn("socket send sample packet failure, save it in database now.\n");
-                database_push_packet(pack_buf, pack_bytes);
+                db_write(pack_buf, pack_bytes);
                 continue;
             }
         }
 
-        /*  socket send packet in database  */
-        if( !database_pop_packet(pack_buf, sizeof(pack_buf), &pack_bytes) )
+        /*  socket send cache packet */
+        if( !db_read(pack_buf, sizeof(pack_buf), &pack_bytes, &rowid) )
         {
             log_debug("socket send database packet bytes[%d]: %s\n", pack_bytes, pack_buf);
             if( socket_send(&sock, pack_buf, pack_bytes) < 0 )
@@ -230,34 +238,21 @@
             else
             {
                 log_warn("socket send database packet okay, remove it from database now.\n");
-                database_del_packet();
+                db_remove(rowid);
             }
         }
 
         msleep(5);
     }
 
+    rv = 0;
+
 cleanup:
     socket_term(&sock);
-    database_term();
-    unlink(DAEMON_PIDFILE);
+    db_close();
     log_close();
+    unlink(DAEMON_PIDFILE);
 
-    return 0;
+    return rv;
 }
 
-int check_sample_time(time_t *last_time, int interval)
-{
-    int                  need = 0; /* no need sample now */
-    time_t               now;
-
-    time(&now);
-
-    if( difftime(now, *last_time)>interval )
-    {
-        need = 1; /* need sample now  */
-        *last_time = now;
-    }
-
-    return need;
-}

--
Gitblit v1.9.1