From 9d2a15e034348a38a569d4ff91047363f608ee79 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Thu, 30 Apr 2020 18:24:25 +0800
Subject: [PATCH] update tlv project, fix server program fatal bug

---
 prj1_tlv/tlv_server.c |   42 ++++++++++++++++++++----------------------
 1 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/prj1_tlv/tlv_server.c b/prj1_tlv/tlv_server.c
index 64782a4..ed2b7d2 100644
--- a/prj1_tlv/tlv_server.c
+++ b/prj1_tlv/tlv_server.c
@@ -71,6 +71,7 @@
     socket_t              sock;
     int                   epollfd;
     int                   connfd;
+    int                   nfds;
     struct epoll_event    event_array[MAX_EVENTS];
 
     char                  buf[1024];
@@ -154,14 +155,17 @@
 
     log_nrml("TLV server program start running\n");
 
+    /* set open file description number to max */
     set_socket_rlimit();
 
+    /* initial listen socket  */
     if( socket_listen(&sock, DEF_LISTEN_IP, port) < 0 )
     {
         log_err("create listen socket failure\n");
         return -2;
     }
 
+    /* create epoll and put listen socket into it  */
     if( (epollfd=epoll_init(MAX_EVENTS, sock.fd)) < 0 )
     {
         log_err("initial epoll for listen socket failure\n");
@@ -171,33 +175,30 @@
     /* g_signal.stop defined in proc.c, and will be set when catch stop signal */
     while( !g_signal.stop )
     {
-        /* program will blocked here */ 
-        rv = epoll_wait(epollfd, event_array, MAX_EVENTS, -1/* never timeout */);
-        if( rv < 0 )
+        /* epoll wailt and program will blocked here */ 
+        nfds = epoll_wait(epollfd, event_array, MAX_EVENTS, -1 /* never timeout */);
+        if( nfds <= 0 )
         {
-            log_err("epoll failure: %s\n", strerror(errno));
-            continue;
-        }
-        else if( rv == 0)
-        {
-            log_err("epoll get timeout\n");
+            log_err("epoll_wait failure or timeout: %s\n", strerror(errno));
             continue;
         }
 
-        /* rv>0 is the active events count */ 
-        for(i=0; i<rv; i++)
+        /* nfds>0 is the active events count */ 
+        for(i=0; i<nfds; i++)
         {
+            /* epoll get error  */
             if ( (event_array[i].events&EPOLLERR) || (event_array[i].events&EPOLLHUP) )
             {
                 log_err("epoll_wait get error on fd[%d]: %s\n", event_array[i].data.fd, strerror(errno));
                 epoll_del(epollfd, event_array[i].data.fd);
                 close(event_array[i].data.fd);
+                continue;
             }
 
             /* listen socket get event means new client start connect now */ 
             if( event_array[i].data.fd == sock.fd )
             {
-                struct epoll_event       event;
+                /* accept new client socket  */
                 if( (connfd=accept(sock.fd, (struct sockaddr *)NULL, NULL)) < 0)
                 {
                     log_nrml("accept new client failure: %s\n", strerror(errno));
@@ -205,22 +206,18 @@
                 }
                 log_info("accept new client socket[%d]\n", connfd);
 
-                event.data.fd = connfd;
-                event.events =  EPOLLIN;
-                epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &event);
-
-#if 0
+                /* add new client socket into epoll  */
                 if( epoll_add(epollfd, connfd) < 0 )
                 {
                     close(connfd);
                     log_err("epoll add client socket failure, rv=%d\n", rv);
                 }
-                log_dbg("epoll add new client socket[%d] ok.\n", connfd);
-#endif
+                log_dbg("epoll add new client socket[%d] ok.\n", connfd); 
             }
+            /* already connected client socket get data arrive  */
             else 
             {
-                rv=read(event_array[i].data.fd, buf, sizeof(buf));
+                rv=read(event_array[i].data.fd, buf, sizeof(buf)); 
                 if( rv <= 0 )
                 {
                     printf("socket[%d] read failure [%s] or disconncet, close and remove now.\n", 
@@ -232,12 +229,13 @@
                 }
                 else
                 {
-                    log_dbg("socket[%d] receive %d bytes data\n", event_array[i].data.fd, rv);
+                    log_dbg("socket[%d] receive %d bytes data\n", event_array[i].data.fd, rv); 
                     logger_dump(LOG_LEVEL_INFO, buf, rv);
                 }
-
             }
         }
+
+        sleep(1);
     }
 
     logger_term();

--
Gitblit v1.9.1