Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
2.39 Кб
Скачать
#include "sock.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 */
int process_cmd (int fd )
{
    char    buf[80];
    time_t  tim;
    char*   cptr;

    /* read commands from a client until EOF or QUIT_CMD */
    while (read(fd, buf, sizeof buf) > 0) 
    {
       int     cmd = ILLEGAL_CMD;
       (void)sscanf(buf,"%d",&cmd);
       switch (cmd) {
          case LOCAL_TIME:
             tim = time(0);
             cptr = ctime(&tim);
             write(fd, cptr, strlen(cptr)+1);
             break;
          case GMT_TIME:
             tim = time(0);
             cptr = asctime(gmtime(&tim));
             write(fd, cptr, strlen(cptr)+1);
             break;
          case QUIT_CMD:
             return cmd;
          default:
             write(fd, MSG1, sizeof MSG1);
       }
    }
    return 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] << " <sockname|port> [<host>]\n";
      return 1;
   }

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

   /* create a stream socket */
   sock sp( port!=-1 ? AF_INET : AF_UNIX, SOCK_STREAM );
   if (!sp.good()) return 1;

   /* Bind a name to the server socket */
   if (sp.bind(port==-1 ? argv[1] : argv[2],port) < 0) return 2;

   for (;;)  // Poll for client connections
   {
       timeRec.tv_sec = 1;       // polling time-out after one second 
       timeRec.tv_usec= 0;   
       FD_ZERO( &select_set );
       FD_SET( sp.fd(), &select_set );
       
       /* wait for time-out or a read event occurs for socket */
       rc = select(FD_SETSIZE, &select_set, 0, 0, &timeRec );
       if (rc > 0 && FD_ISSET(sp.fd(), &select_set)) 
       {
          /* accept a connection request from a client socket */
          if ((nsid = sp.accept(0, 0)) < 0) return 1;

          /* process commands */
          if (process_cmd(nsid)==QUIT_CMD) break;

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