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

网络

开发平台:

Unix_Linux

  1. /* daytimed.c - main */
  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 <stdio.h>
  8. #include <string.h>
  9. extern int errno;
  10. int daytime(char buf[]);
  11. int errexit(const char *format, ...);
  12. int passiveTCP(const char *service, int qlen);
  13. int passiveUDP(const char *service);
  14. #define MAX(x, y) ((x) > (y) ? (x) : (y))
  15. #define QLEN  32
  16. #define LINELEN 128
  17. /*------------------------------------------------------------------------
  18.  * main - Iterative server for DAYTIME service
  19.  *------------------------------------------------------------------------
  20.  */
  21. int
  22. main(int argc, char *argv[])
  23. {
  24. char *service = "daytime"; /* service name or port number */
  25. char buf[LINELEN+1]; /* buffer for one line of text */
  26. struct sockaddr_in fsin; /* the request from address */
  27. unsigned int alen; /* from-address length */
  28. int tsock;  /* TCP master socket */
  29. int usock; /* UDP socket */
  30. int nfds;
  31. fd_set rfds; /* readable file descriptors */
  32. switch (argc) {
  33. case 1:
  34. break;
  35. case 2:
  36. service = argv[1];
  37. break;
  38. default:
  39. errexit("usage: daytimed [port]n");
  40. }
  41. tsock = passiveTCP(service, QLEN);
  42. usock = passiveUDP(service);
  43. nfds = MAX(tsock, usock) + 1; /* bit number of max fd */
  44. FD_ZERO(&rfds);
  45. while (1) {
  46. FD_SET(tsock, &rfds);
  47. FD_SET(usock, &rfds);
  48. if (select(nfds, &rfds, (fd_set *)0, (fd_set *)0,
  49. (struct timeval *)0) < 0)
  50. errexit("select error: %sn", strerror(errno));
  51. if (FD_ISSET(tsock, &rfds)) {
  52. int ssock; /* TCP slave socket */
  53. alen = sizeof(fsin);
  54. ssock = accept(tsock, (struct sockaddr *)&fsin,
  55. &alen);
  56. if (ssock < 0)
  57. errexit("accept failed: %sn",
  58. strerror(errno));
  59. daytime(buf);
  60. (void) write(ssock, buf, strlen(buf));
  61. (void) close(ssock);
  62. }
  63. if (FD_ISSET(usock, &rfds)) {
  64. alen = sizeof(fsin);
  65. if (recvfrom(usock, buf, sizeof(buf), 0,
  66. (struct sockaddr *)&fsin, &alen) < 0)
  67. errexit("recvfrom: %sn",
  68. strerror(errno));
  69. daytime(buf);
  70. (void) sendto(usock, buf, strlen(buf), 0,
  71. (struct sockaddr *)&fsin, sizeof(fsin));
  72. }
  73. }
  74. }
  75. /*------------------------------------------------------------------------
  76.  * daytime - fill the given buffer with the time of day
  77.  *------------------------------------------------------------------------
  78.  */
  79. int
  80. daytime(char buf[])
  81. {
  82. char *ctime();
  83. time_t now;
  84. (void) time(&now);
  85. sprintf(buf, "%s", ctime(&now));
  86. }