home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / libncftp / older_versions / libncftp-3.1.5-src.tar.gz / libncftp-3.1.5-src.tar / libncftp-3.1.5 / sio / srltest.c < prev    next >
C/C++ Source or Header  |  2001-11-15  |  3KB  |  119 lines

  1. /* srltest.c */
  2.  
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/time.h>
  6. #include <sys/socket.h>
  7. #include <sys/wait.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <errno.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #include <ctype.h>
  16. #ifdef CAN_USE_SYS_SELECT_H
  17. #    include <sys/select.h>
  18. #endif
  19.  
  20. #include "sio.h"
  21.  
  22. static void
  23. ServeOneClient(int sockfd, struct sockaddr_in *cliAddr)
  24. {
  25.     char buf[80], cliAddrStr[64];
  26.     char bbuf[320];
  27.     int nread, nwrote, i;
  28.     SReadlineInfo srl;
  29.  
  30.     printf("subserver[%d]: started, connected to %s.\n", (int) getpid(),
  31.         AddrToAddrStr(cliAddrStr, sizeof(cliAddrStr), cliAddr, 1, "<%h:%p>")
  32.     );
  33.  
  34.     if (InitSReadlineInfo(&srl, sockfd, bbuf, sizeof(bbuf), 5) < 0) {
  35.         fprintf(stderr, "subserver[%d]: InitSReadlineInfo error: %s\n",
  36.             (int) getpid(), strerror(errno));
  37.         exit(1);
  38.     }
  39.     for (;;) {
  40.         nread = SReadline(&srl, buf, sizeof(buf));
  41.         if (nread == 0) {
  42.             break;
  43.         } else if (nread == kTimeoutErr) {
  44.             printf("subserver[%d]: idle\n", (int) getpid());
  45.             continue;
  46.         } else if (nread < 0) {
  47.             fprintf(stderr, "subserver[%d]: read error: %s\n",
  48.                 (int) getpid(), strerror(errno));
  49.             break;
  50.         }
  51.         for (i=0; i<nread; i++)
  52.             if (islower(buf[i]))
  53.                 buf[i] = toupper(buf[i]);
  54.         nwrote = SWrite(sockfd, buf, nread, 15);
  55.         if (nwrote < 0) {
  56.             fprintf(stderr, "subserver[%d]: write error: %s\n",
  57.                 (int) getpid(), strerror(errno));
  58.             break;
  59.         }
  60.     }
  61.     (void) SClose(sockfd, 10);
  62.     printf("subserver[%d]: done.\n", (int) getpid());
  63.     exit(0);
  64. }    /* ServeOneClient */
  65.  
  66.  
  67.  
  68. static void
  69. Server(int port)
  70. {
  71.     int sockfd, newsockfd;
  72.     struct sockaddr_in cliAddr;
  73.     int pid;
  74.  
  75.     sockfd = SNewStreamServer(port, 3, kReUseAddrYes, 3);
  76.     if (sockfd < 0) {
  77.         perror("Server setup failed");
  78.         exit(1);
  79.     }
  80.  
  81.     printf("server[%d]: started.\n", (int) getpid());
  82.     for(;;) {
  83.         while (waitpid(-1, NULL, WNOHANG) > 0) ;
  84.         newsockfd = SAccept(sockfd, &cliAddr, 5);
  85.         if (newsockfd < 0) {
  86.             if (newsockfd == kTimeoutErr)
  87.                 printf("server[%d]: idle\n", (int) getpid());
  88.             else
  89.                 fprintf(stderr, "server[%d]: accept error: %s\n",
  90.                     (int) getpid(), strerror(errno));
  91.         } else if ((pid = fork()) < 0) {
  92.             fprintf(stderr, "server[%d]: fork error: %s\n",
  93.                 (int) getpid(), strerror(errno));
  94.             exit(1);
  95.         } else if (pid == 0) {
  96.             ServeOneClient(newsockfd, &cliAddr);
  97.             exit(0);
  98.         } else {
  99.             /* Parent doesn't need it now. */
  100.             (void) close(newsockfd);
  101.         }
  102.     }
  103. }    /* Server */
  104.  
  105.  
  106. void
  107. main(int argc, char **argv)
  108. {
  109.     int port;
  110.  
  111.     if (argc < 2) {
  112.         fprintf(stderr, "Usage: %s <port>\n", argv[0]);
  113.         exit(2);
  114.     }
  115.     port = atoi(argv[1]);
  116.     Server(port);
  117.     exit(0);
  118. }    /* main */
  119.