Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
01.05.2014
Размер:
2.63 Кб
Скачать
#include "tli.h"
#include <sys/times.h>
#include <sys/types.h>

#define MSG1 "Invalid cmd to message server" 

typedef enum { LOCAL_TIME, GMT_TIME, QUIT_CMD, ILLEGAL_CMD } CMDS;

/* process a client's commands */
void process_cmd (tli* sp, int fd )
{
    char    buf[80];
    time_t  tim;
    char*   cptr;
    int     flags;

    switch (fork()) {
       case -1:  perror("fork");  return;
       case 0:   break;
       default:  return;  // parent 
    }

    /* read commands from a client until EOF or QUIT_CMD */
    while (sp->read(buf, sizeof buf, flags, fd) > 0) 
    {
       cerr << "server: read cmd: '" << buf << "'\n";
       int     cmd = ILLEGAL_CMD;
       (void)sscanf(buf,"%d",&cmd);
       switch (cmd) {
          case LOCAL_TIME:
             tim = time(0);
             cptr = ctime(&tim);
             sp->write(cptr, strlen(cptr)+1, fd);
             break;
          case GMT_TIME:
             tim = time(0);
             cptr = asctime(gmtime(&tim));
             sp->write(cptr, strlen(cptr)+1, fd);
             break;
          case QUIT_CMD:
             sp->shutdown(fd);
             exit(0); 
          default:
             sp->write(MSG1, sizeof MSG1, fd);
       }
    }
    exit(0);   
}

int main( int argc, char* argv[]) 
{
   char  buf[80], socknm[80];
   int  port=-1, nsid, rc;
   fd_set  select_set;
   struct timeval timeRec;

   if (argc < 2) {
      cerr << "usage: " << argv[0] << " <service|no> [<host>]\n";
      return 1;
   }

   /* check if port no. of a socket name is specified */
   (void)sscanf(argv[1],"%d",&port);

   /* create a stream socket */
   tli  *sp;
   if (port==-1)  
      sp = new tli( argv[2], argv[1] );
   else sp = new tli (port);

   if (!sp || !sp->good()) {
      cerr << "server: create transport endpoint object fails\n";
      return 1;
   }

   /* Bind a name to the server's transport end-point */
   if (sp->Bind() < 0) {
      cerr << "server: bind fails\n";
      return 2;
   }

   for (struct t_call *call=0; sp->listen(call)==0; ) 
   {
       /* accept a connection request from a client socket */
       if ((nsid = sp->accept(call)) < 0) 
       {
           cerr << "server: accept fails\n";
           return 3;
       }

       t_free((char*)call, T_CALL); // deallocate memory

       cerr << "server: got one client connection. nsid=" << nsid << "\n";

       /* create a child process to process commands */
       process_cmd(sp,nsid);

       close(nsid); /* re-cycle file descriptor */
    }
    sp->shutdown();
    return 0;
}
Соседние файлы в папке tli