⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9-6.c

📁 这是Linux应用开发技术详解上的源码
💻 C
字号:
 /*--
      
       Copyright (c) 
      
       File Name:
               auth_svr.c
       Version:
              1.0
       Abstract:
              Authentication service program source code
      Author:
             xxx 
      Created on:
              0000-00-
      Modified History:
     
      Modified Person:
     
     --*/
     
      #include <stdio.h>
      #include <errno.h>
      #include <stdlib.h>
      #include <string.h>
      #include <signal.h>
      #include <sys/wait.h>
      #include "afxdef.h"
      #include "xmlfn.h"
      #include "utilex.h"
      #include "bsocket.h"
      #include "service.h"
      #include "classid.h"
     #include "tariff.h"
     
     
      /* Declare program run flag */
      extern int g_runflag;
     
      void run_service();
     
      void request_trans(SOCKET* sock, const char* ip);
     
      int request_recv(SOCKET sock, xmlkeylist* list);
     
     
      int main(void)
      {
              /* Set signal transaction */
              signal(SIGTERM, sig_action);
              //signal(SIGINT,  sig_action);
              signal(SIGPIPE, sig_action);
              signal(SIGQUIT, sig_action);
              signal(SIGHUP,  sig_action);
              signal(SIGCHLD, clean_childpid);
     
              if ( load_config("../etc/kernel.ini") ) {
                      fprintf(stderr, "Fail to load_config() \n");
              }
     
              if ( load_tariff() ) {
                      fprintf(stderr, "Fail to load_tariff() \n");
              }
              if ( init_classid() ) {
                      fprintf(stderr, "Fail to init_classid() \n");
                      return -1;
            }
     
             /* Run level service */
              run_service();
     
              return 0;
      }
     
     
      void run_service()
      {
              SOCKET lis_sock;
              SOCKET cli_sock;
              char fromip[20];
     
              if ( (lis_sock = create_sock(AF_INET, SOCK_STREAM, 0)) == -1 ) {
                 fprintf(stderr, "Fail to create socket \n");
                      return;
              }
     
              if ( bind_sock(lis_sock, LIS_PORT) != 0 ) {
                      fprintf(stderr, "Fail to bind socket \n");
                      return;
              }
     
              if ( listen_sock(lis_sock, 15) != 0 ) {
                      fprintf(stderr, "Fail to listen port \n");
                      return;
              }
     
              while ( g_runflag ) {
     
                      if ( (cli_sock = accept_sock(lis_sock, fromip)) == -1 ) {
    
                             if ( errno == EINTR )
                                     continue;
                             else {
                                     fprintf(stderr, "Fail to accept socket \n");
                                     break;
                             }
                     }
    
                     if ( fork() == 0 ) {
                             /* Request transaction */
                             signal(SIGTERM, SIG_IGN);
                             request_trans(&cli_sock, fromip);
                             exit(0);
                     }
                     else
                             close_sock(&cli_sock);
    
             } // end while
    
             close_sock(&lis_sock);
             return;
     }

    
     void request_trans(SOCKET* sock, const char* ip)
    {
             int rs;
            xmlkeylist list;
    
             do {
                     /* Receive request message */
                     rs = request_recv(*sock, &list);
                     if ( rs != 0 )
                             break; /* jump out loop */
    
                     /* classify service */
                     rs = xml_service(*sock, &list);
                     if ( rs != 0 )
                             break;  /* jump out loop */
    
             }  while ( 0 ); // end while
    
             close_sock(sock);
             return;
     }
    
    
     int request_recv(SOCKET sock, xmlkeylist* list)
    {
            int rs;
             char buf[1024];
    
             /* Receive XML string */
             rs = recv_sock(sock, buf, sizeof(buf) - 1);
            if ( rs <= 0 )  /* error occur or receive end flag */
                     return -1;
    
     #ifdef _DEBUG
             buf[rs] = 0;
             printf("Recv: %s\n", buf);
     #endif
             rs = get_xml_keylist(buf, rs, list);
             return rs;
     }
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -