Procházet zdrojové kódy

用杀线程的方式实现getaddrinfo超时

guohui před 1 rokem
rodič
revize
0cf8137222
5 změnil soubory, kde provedl 86 přidání a 134 odebrání
  1. 27 18
      pro/src/app.c
  2. 0 1
      pro/src/appweb_handle.c
  3. 41 102
      pro/src/ntpclient.c
  4. 3 6
      pro/src/ntpclient.h
  5. 15 7
      pro/src/sqlite_handle.c

+ 27 - 18
pro/src/app.c

@@ -1771,7 +1771,7 @@ static void* shm_thread(void *arg)
 	pthread_exit(NULL);
 }
 
-#define USE_NTPD
+//#define USE_NTPD
 static void* ntp_thread(void *arg)
 {
     int r=0,flag=0;
@@ -1819,6 +1819,31 @@ static void* ntp_thread(void *arg)
 
     pthread_exit(NULL);
 }
+int ntp_config(NTPManager *nm)
+{
+    int r=0;
+
+#ifdef USE_NTPD
+    if(nm->mode==1) {
+        char cmd[400];
+        char *conf="/etc/ntp.conf";
+
+        sprintf(cmd, "sed -e /^server.*$/d -e \"$ a server %s minpoll 4 maxpoll 5\" -i %s", nm->ntpaddress, conf);
+        printf("___cmd: %s\n", cmd);
+        r = system(cmd);
+        system("/etc/init.d/S49ntp restart");
+    }
+    else {
+        system("/etc/init.d/S49ntp stop");
+    }
+#else
+    if(nm->mode==1) {
+        ntp_sync_flag = 1;
+    }
+#endif
+
+    return r;
+}
 static int ntp_init(void)
 {
     int r=0,flag=0;
@@ -1848,29 +1873,13 @@ static int ntp_init(void)
     }
     dev_Alarm_Run_message(dm, language_alarm_Init_Success[0], "NTP");
 
+    ntp_config(pntp);
 #ifndef USE_NTPD
     thread_start(THREAD_ID_NTP, ntp_thread, dm);
 #endif
 
     return 0;
 }
-int ntp_config(NTPManager *nm)
-{
-    int r=-1;
-
-#ifdef USE_NTPD
-    char cmd[400];
-    char *conf="/etc/ntp.conf";
-
-    sprintf(cmd, "sed -e /^server.*$/d -e \"$ a server %s minpoll 4 maxpoll 5\" -i %s", nm->ntpaddress, conf);
-    printf("___cmd: %s\n", cmd);
-    r = system(cmd);
-    system("/etc/init.d/S49ntp restart");
-#endif
-
-    return r;
-}
-
 
 
 int snmp_config(SNMPManager *m)

+ 0 - 1
pro/src/appweb_handle.c

@@ -4107,7 +4107,6 @@ static void serviceManagement(void *conn)
         else if (_globalNTPManager.mode == 1)
         {
             set_zone(_globalNTPManager.tzone);
-            ntp_sync_flag = 1;
             extern int ntp_config(NTPManager *nm);
             ntp_config(&_globalNTPManager);
         }

+ 41 - 102
pro/src/ntpclient.c

@@ -5,7 +5,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include "ntpclient.h"
-
+#include "thread.h"
   
 #define NTP_PORT 123  
 #define NTP_PACKET_SIZE 48  
@@ -66,57 +66,13 @@ static int get_addr(ipaddr_t *addr, struct addrinfo *info)
 }
 
 
-//#define GETADDR_ASYNC
-//#define GETADDR_SYNC_TIMEOUT
-
-#ifdef GETADDR_ASYNC
-static timer_t tmrId=NULL;
-static struct gaicb hostReq;
-static void timer_fn(union sigval value)
-{
-    printf("___ XXXXXXXXXXXXXXXXXXX\n");
-    gai_cancel(&hostReq);
-    timer_delete(tmrId);
-}
-static int start_timer(int flag)
+static void *tmp_thread(void *arg)
 {
-    struct sigevent sev;
-    struct itimerspec its={0};
-
-    memset(&sev, 0, sizeof(sev));
-    sev.sigev_value.sival_ptr = &tmrId;
-    sev.sigev_notify = SIGEV_THREAD;
-    sev.sigev_notify_function = timer_fn;
-    sev.sigev_value.sival_int = 11;
-    sev.sigev_notify_attributes = NULL;
-    if (timer_create(CLOCK_REALTIME, &sev, &tmrId) == -1) {
-        perror("timer_create");
-        return -1;
-    }
-
-    its.it_value.tv_sec = 2;
-    its.it_value.tv_nsec = 0;
-    its.it_interval.tv_sec = 0;
-    its.it_interval.tv_nsec = 0;
-    if (timer_settime(tmrId, 0, &its, NULL) == -1) {
-        perror("timer_settime");
-        return -1;
-    }
-    return 0;
-}
-#endif
-
-NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec) {  
-    NTPClient* client = (NTPClient*)malloc(sizeof(NTPClient));  
-    if (!client) {  
-        perror("createNTPClient, malloc failed\n");  
-        return NULL;  
-    } 
-
     ipaddr_t ipa;
     int r,fd=-1,err;
     struct addrinfo hints;
     struct addrinfo *res=NULL,*rp;
+    NTPClient *pc=(NTPClient*)arg;
     char tmp[32];
 
     memset(&hints, 0, sizeof hints);
@@ -124,60 +80,17 @@ NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec) {
     hints.ai_socktype = SOCK_DGRAM;
     hints.ai_protocol = 0;//IPPROTO_UDP;
 
-    sprintf(tmp, "%d", port);
-#ifdef GETADDR_ASYNC
-    struct sigevent sig;
-    struct gaicb *pcb=&hostReq;
-
-    hostReq.ar_name = strdup(ntp_server);
-    hostReq.ar_service = strdup(tmp); //the port we will listen on
-    hostReq.ar_request = &hints;
-
-    sig.sigev_notify = SIGEV_SIGNAL;
-    sig.sigev_value.sival_ptr = &hostReq;
-    sig.sigev_signo = SIGRTMIN;
+    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+    pthread_testcancel();
 
-    err = getaddrinfo_a(GAI_NOWAIT, &pcb, 1, &sig);
+    sprintf(tmp, "%d", pc->port);
+    printf("___getaddrinfo in\n");
+    err = getaddrinfo(pc->server, tmp, &hints, &res);
     if(err){
-        printf(" getaddrinfo from %sfailed, %s\n", ntp_server, gai_strerror(err));  
-        free(client); return NULL;
-    }
-#else
-    
-#ifdef GETADDR_SYNC_TIMEOUT
-    fd_set fds;
-    struct timeval tv;
-    fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if (fd < 0) {
-        perror("socket error");
-        free(client);
-        return NULL;
+        printf("___getaddrinfo from %s failed, %s\n", pc->server, gai_strerror(err));
+        pthread_exit(NULL);
     }
-    // 设置套接字为非阻塞模式
-    int flags = fcntl(fd, F_GETFL, 0);
-    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
-#endif
-
-    err = getaddrinfo(ntp_server, tmp, &hints, &res);
-    if(err){
-        printf(" getaddrinfo from %s failed, %s\n", ntp_server, gai_strerror(err));
-        close(fd);
-        free(client); return NULL;
-    }
-
-#ifdef GETADDR_SYNC_TIMEOUT
-    FD_ZERO(&fds); FD_SET(fd, &fds);
-    tv.tv_sec = timeout_sec; tv.tv_usec = 0;
-    int n = select(fd, NULL, &fds, NULL, &tv);
-    if (n <= 0) { // 0:超时  <0:出错
-        close(fd);
-        freeaddrinfo(res);
-        free(client);
-        printf("___ %s !!\n", (n==0)?"timeout":"error");
-        return NULL;
-    }
-    close(fd);
-#endif
+    printf("___getaddrinfo out\n");
 
     for(rp=res; rp; rp=rp->ai_next){
         get_addr(&ipa, rp);
@@ -185,18 +98,44 @@ NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec) {
 
         fd = socket(rp->ai_family, rp->ai_socktype, 0);
         if (fd>=0) {
-            client->sockfd = fd;
-            client->server_addr = *rp->ai_addr;
+            pc->sockfd = fd;
+            pc->server_addr = *rp->ai_addr;
             printf("ok!\n");
             break;
         }
         printf("failed!\n");
     }
     freeaddrinfo(res);
-    if(fd<0) {
+    pc->flag = 1;
+
+    pthread_exit(NULL);
+}
+NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec) {  
+    NTPClient* client = (NTPClient*)malloc(sizeof(NTPClient));  
+    if (!client) {  
+        perror("createNTPClient, malloc failed\n");  
+        return NULL;  
+    } 
+
+    pthread_t tid;
+    client->server = (char*)ntp_server;
+    client->port = port;
+    client->flag = 0;
+    pthread_create(&tid, NULL, tmp_thread, client);
+    for(int i=0; i<timeout_sec; i++) {
+        if(client->flag==1) {
+            break;
+        }
+        sleep(1);
+    }
+    if(client->flag==0) {
+        printf("___getaddrinfo timeout, cancel thread %lu\n", (unsigned long)tid);
+        pthread_cancel(tid);//SIGTERM
+        pthread_join(tid, NULL);
+        printf("___cancel ok!\n");
+
         free(client); return NULL;
     }
-#endif
     printf("___createNTPClient ok!\n");
   
     return client;  

+ 3 - 6
pro/src/ntpclient.h

@@ -14,16 +14,13 @@
 #define NTP_PORT 123  
 #define NTP_PACKET_SIZE 48  
 
-
-typedef struct {
-    timer_t    tmr;
-}timer_handle_t;
-
 typedef struct NTPClient_s {  
     int sockfd;  
     struct sockaddr server_addr;  
     char ntp_packet[NTP_PACKET_SIZE]; 
-    timer_t tmr; 
+    int  flag; 
+    char *server;
+    int  port;
 } NTPClient;  
     
 NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec);

+ 15 - 7
pro/src/sqlite_handle.c

@@ -4737,13 +4737,21 @@ static int db_requery(sqlite3 *db, int tab_id, time_t from, time_t to, handle_t
     else if(tab_id==TAB_ID_ALARM_INFO) {
         //
     }
+    else if(tab_id==TAB_ID_SENSOR) {
+        //
+    }
+    else if(tab_id==TAB_ID_SENSOR_INFO) {
+        //sprintf(select_sql,"SELECT* FROM Table_SensorInfo WHERE (sensor_id=%d) AND (sensor_samp_time BETWEEN '%s' AND '%s') ORDER BY sensor_samp_time DESC LIMIT %d OFFSET %d;",
+        //snprintf(temp, sizeof(temp), "SELECT * FROM %s WHERE (product_ph_samp_time BETWEEN '%s' AND '%s') ORDER BY product_index DESC;", tabNamePool[tab_id], time_s, time_e);
+
+    }
     else {
         return -1;
     }
 
     return 0;
 }
-static int data_io(sqlite3 *db, int tab_id, int io_type, time_t from, time_t to, void *data)
+static int db_data_io(sqlite3 *db, int tab_id, int io_type, time_t from, time_t to, void *data)
 {
     int i,r=-1;
 
@@ -4834,10 +4842,10 @@ static int data_io(sqlite3 *db, int tab_id, int io_type, time_t from, time_t to,
         case TAB_ID_TIMER:
         {
             if(io_type==IO_IMPORT) {
-                r = dev_update_ntp_info(db, 0, (NTPManager*)data);
+                //r = dev_update_ntp_info(db, 0, (NTPManager*)data);
             }
             else {
-                r = dev_get_ntp_info(db, (NTPManager*)data);
+                //r = dev_get_ntp_info(db, (NTPManager*)data);
             }
         }
         break;
@@ -4869,8 +4877,8 @@ static int data_io(sqlite3 *db, int tab_id, int io_type, time_t from, time_t to,
         case TAB_ID_SENSOR:
         {
             if(io_type==IO_IMPORT) {
-                //r = dev_update_sensor_genera_manage(db, 0, sensor_id, (NTPManager*)data);
-                //r = dev_update_sensor_over_manage(db, 0, sensor_id, (NTPManager*)data);
+                //r = dev_update_sensor_genera_manage(db, 0, sensor_id, (GlobalSensorManger*)data);
+                //r = dev_update_sensor_over_manage(db, 0, sensor_id, (GlobalSensorManger*)data);
             }
             else {
                 r = dev_get_sensor_manage_info(db, 0, (GlobalSensorManger*)data);
@@ -4917,7 +4925,7 @@ static int data_io(sqlite3 *db, int tab_id, int io_type, time_t from, time_t to,
     return 0;
 }
 //////////////////////////////////////////////////////////////////////////
-static int sensor_xport(int io_type, char *path)
+static int sensor_xport(sqlite3 *db, int io_type, char *path)
 {
     int i,r;
     handle_t l;
@@ -4926,7 +4934,7 @@ static int sensor_xport(int io_type, char *path)
 
     l = xlist_init(&lc);
     
-    //
+    //r = db_data_io(db, TAB_ID_SENSOR, io_type, 0, 0, );
 
     for(i=0; i<xlist_size(l); i++) {
         r = xlist_take_node(l, &ln, 0);