main.c
上传用户:dayuan858
上传日期:2007-01-04
资源大小:194k
文件大小:2k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <sys/wait.h>
  5. #include <sys/errno.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <varargs.h>
  9. #include <signal.h>
  10. #define SERV_TCP_PORT 110
  11. char *pname = NULL;
  12. pid_t pgrpid;
  13. int clean=0;
  14. extern int errno;
  15. extern int sys_nerr;
  16. extern char *sys_errlist[];
  17. void reaper();
  18. void cleanup();
  19. main(argc, argv)
  20. int argc;
  21. char *argv[];
  22. {
  23. int sockfd, newsockfd, clilen, childpid;
  24. struct sockaddr_in cli_addr, serv_addr;
  25. pname = argv[0];
  26. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  27. err_dump("Server : Can't open stream socket");
  28. bzero((char *) &serv_addr, sizeof(serv_addr));
  29. serv_addr.sin_family = AF_INET;
  30. serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  31. serv_addr.sin_port = htons(SERV_TCP_PORT);
  32. if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  33. err_dump("Server : Can't bind local address");
  34. listen(sockfd, 5);
  35. signal(SIGCHLD, reaper);
  36. signal(SIGTERM, cleanup);
  37. pgrpid = setpgrp();
  38. for(;;) {
  39. if(clean)
  40. {
  41. close(sockfd);
  42. exit(0);
  43. }
  44. clilen = sizeof(cli_addr);
  45. newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  46. if(newsockfd < 0)
  47. {
  48. if(errno == EINTR)
  49. continue;
  50. err_dump("Server: accept error");
  51. }
  52. if((childpid = fork()) < 0)
  53. err_dump("Server : fork error");
  54. else if(childpid == 0) {
  55. close(sockfd);
  56. dup2(newsockfd,0);
  57. dup2(newsockfd,1);
  58. dup2(newsockfd,2);
  59. close(newsockfd);
  60. printf("Starting the popper servern");
  61. popper(argc,argv);
  62. exit(0);
  63. }
  64. close(newsockfd);
  65. }
  66. }
  67. err_dump(va_alist)
  68. va_dcl
  69. {
  70. va_list args;
  71. char *fmt;
  72. va_start(args);
  73. if(pname != NULL)
  74. fprintf(stderr, "%s: ", pname);
  75. fmt = va_arg(args, char *);
  76. vfprintf(stderr, fmt, args);
  77. va_end(args);
  78. my_perror();
  79. fflush(stdout);
  80. fflush(stderr);
  81. abort();
  82. exit(1);
  83. }
  84. my_perror()
  85. {
  86. char *sys_err_str();
  87. fprintf(stderr, " %sn", sys_err_str());
  88. }
  89. char *sys_err_str()
  90. {
  91. static char msgstr[200];
  92. if(errno != 0)
  93. if(errno > 0 && errno < sys_nerr)
  94. sprintf(msgstr,"(%s)", sys_errlist[errno]);
  95. else
  96. sprintf(msgstr,"(errno = %d)", errno);
  97. else
  98. msgstr[0] = '';
  99. return(msgstr);
  100. }
  101. void reaper()
  102. {
  103. int stts;
  104. while(wait3(&stts, WNOHANG, (struct rusage *)0) >= 0);
  105. signal(SIGCHLD, reaper);
  106. }
  107. void cleanup()
  108. {
  109. killpg(pgrpid,SIGHUP);
  110. clean = 1;
  111. }