APUE Learning Example Source Code
guowenxue
2019-06-26 0738d2f6c9e2aa1fa7989d0f28704e491ea2c7f2
ch4_thread/socket_server_thread.c
@@ -8,14 +8,13 @@
#include <stdlib.h>
#include <getopt.h>
#include <pthread.h>
#include <ctype.h>
#define MSG_STR "Hello LingYun IoT Studio Client\n"
typedef void *(THREAD_BODY) (void *thread_arg);
void *thread_worker(void *ctx);
int thread_start(pthread_t * thread_id, THREAD_BODY * thread_workbody, void *thread_arg);
void print_usage(char *progname)
{
@@ -80,8 +79,8 @@
   memset(&servaddr, 0, sizeof(servaddr));
   servaddr.sin_family=AF_INET;
   servaddr.sin_port = htons(port);
   servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
   //inet_aton("192.168.0.16", &servaddr.sin_addr);
   servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* listen all the IP address on this host */
   //inet_aton("192.168.0.16", &servaddr.sin_addr); /* Only listen specify IP address on this host */
   rv=bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
   if(rv < 0)
@@ -106,7 +105,8 @@
      printf("Accept new client[%s:%d] successfully\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
      thread_start(&tid, thread_worker, &clifd);
      /* ???? Can not pass &clifd to child process, U can think about the reason  ???? */
      thread_start(&tid, thread_worker, (void *)clifd);
   }
@@ -159,6 +159,7 @@
   int                  clifd;
   int                  rv;
          char                 buf[1024]; 
   int                  i;
   if( !ctx )
   {
@@ -166,7 +167,7 @@
      pthread_exit(NULL);
   }
   clifd = *(int *)ctx;
   clifd = (int)ctx;
   
   printf("Child thread start to commuicate with socket client...\n");
   
@@ -176,13 +177,13 @@
             rv=read(clifd, buf, sizeof(buf));
             if( rv < 0)
             {
                printf("Read data from client sockfd[%d] failure: %s\n", clifd, strerror(errno));
                printf("Read data from client sockfd[%d] failure: %s and thread will exit\n", clifd, strerror(errno));
                close(clifd);
                pthread_exit(NULL);
             }
      else if( rv == 0)
             { 
         printf("Socket[%d] get disconnected\n", clifd);
         printf("Socket[%d] get disconnected and thread will exit.\n", clifd);
                close(clifd);
                pthread_exit(NULL);
             } 
@@ -190,11 +191,17 @@
      {
                printf("Read %d bytes data from Server: %s\n", rv, buf);
             }
      /* convert letter from lowercase to uppercase */
      for(i=0; i<rv; i++)
      {
         buf[i]=toupper(buf[i]);
      }
          
      rv=write(clifd, buf, rv);
             if(rv < 0)
             {
                printf("Write to client by sockfd[%d] failure: %s\n", clifd, strerror(errno));
                printf("Write to client by sockfd[%d] failure: %s and thread will exit\n", clifd, strerror(errno));
                close(clifd);
                pthread_exit(NULL);
             }