TCPmechod.c
上传用户:wei_4586
上传日期:2008-05-28
资源大小:18k
文件大小:2k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* TCPmechod.c - main, echo */
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <sys/time.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #define QLEN   32 /* maximum connection queue length */
  10. #define BUFSIZE 4096
  11. extern int errno;
  12. int errexit(const char *format, ...);
  13. int passiveTCP(const char *service, int qlen);
  14. int echo(int fd);
  15. /*------------------------------------------------------------------------
  16.  * main - Concurrent TCP server for ECHO service
  17.  *------------------------------------------------------------------------
  18.  */
  19. int
  20. main(int argc, char *argv[])
  21. {
  22. char *service = "echo"; /* service name or port number */
  23. struct sockaddr_in fsin; /* the from address of a client */
  24. int msock; /* master server socket */
  25. fd_set rfds; /* read file descriptor set */
  26. fd_set afds; /* active file descriptor set */
  27. unsigned int alen; /* from-address length */
  28. int fd, nfds;
  29. switch (argc) {
  30. case 1:
  31. break;
  32. case 2:
  33. service = argv[1];
  34. break;
  35. default:
  36. errexit("usage: TCPmechod [port]n");
  37. }
  38. msock = passiveTCP(service, QLEN);
  39. nfds = getdtablesize();
  40. FD_ZERO(&afds);
  41. FD_SET(msock, &afds);
  42. while (1) {
  43. memcpy(&rfds, &afds, sizeof(rfds));
  44. if (select(nfds, &rfds, (fd_set *)0, (fd_set *)0,
  45. (struct timeval *)0) < 0)
  46. errexit("select: %sn", strerror(errno));
  47. if (FD_ISSET(msock, &rfds)) {
  48. int ssock;
  49. alen = sizeof(fsin);
  50. ssock = accept(msock, (struct sockaddr *)&fsin,
  51. &alen);
  52. if (ssock < 0)
  53. errexit("accept: %sn",
  54. strerror(errno));
  55. FD_SET(ssock, &afds);
  56. }
  57. for (fd=0; fd<nfds; ++fd)
  58. if (fd != msock && FD_ISSET(fd, &rfds))
  59. if (echo(fd) == 0) {
  60. (void) close(fd);
  61. FD_CLR(fd, &afds);
  62. }
  63. }
  64. }
  65. /*------------------------------------------------------------------------
  66.  * echo - echo one buffer of data, returning byte count
  67.  *------------------------------------------------------------------------
  68.  */
  69. int
  70. echo(int fd)
  71. {
  72. char buf[BUFSIZ];
  73. int cc;
  74. cc = read(fd, buf, sizeof buf);
  75. if (cc < 0)
  76. errexit("echo read: %sn", strerror(errno));
  77. if (cc && write(fd, buf, cc) < 0)
  78. errexit("echo write: %sn", strerror(errno));
  79. return cc;
  80. }