udpserv03.lc 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /* include udpserv1 */
  2. #include "unpifi.h"## 1 ##src/advio/udpserv03.c##
  3. void mydg_echo(int, SA *, socklen_t, SA *);## 2 ##src/advio/udpserv03.c##
  4. int## 3 ##src/advio/udpserv03.c##
  5. main(int argc, char **argv)## 4 ##src/advio/udpserv03.c##
  6. {## 5 ##src/advio/udpserv03.c##
  7. int sockfd;## 6 ##src/advio/udpserv03.c##
  8. const int on = 1;## 7 ##src/advio/udpserv03.c##
  9. pid_t pid;## 8 ##src/advio/udpserv03.c##
  10. struct ifi_info *ifi, *ifihead;## 9 ##src/advio/udpserv03.c##
  11. struct sockaddr_in *sa, cliaddr, wildaddr;## 10 ##src/advio/udpserv03.c##
  12. for (ifihead = ifi = Get_ifi_info(AF_INET, 1);## 11 ##src/advio/udpserv03.c##
  13. ifi != NULL; ifi = ifi->ifi_next) {## 12 ##src/advio/udpserv03.c##
  14. /* 4bind unicast address */## 13 ##src/advio/udpserv03.c##
  15. sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 14 ##src/advio/udpserv03.c##
  16. Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 15 ##src/advio/udpserv03.c##
  17. sa = (struct sockaddr_in *) ifi->ifi_addr;## 16 ##src/advio/udpserv03.c##
  18. sa->sin_family = AF_INET;## 17 ##src/advio/udpserv03.c##
  19. sa->sin_port = htons(SERV_PORT);## 18 ##src/advio/udpserv03.c##
  20. Bind(sockfd, (SA *) sa, sizeof(*sa));## 19 ##src/advio/udpserv03.c##
  21. printf("bound %s\n", Sock_ntop((SA *) sa, sizeof(*sa)));## 20 ##src/advio/udpserv03.c##
  22. if ((pid = Fork()) == 0) { /* child */## 21 ##src/advio/udpserv03.c##
  23. mydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), (SA *) sa);## 22 ##src/advio/udpserv03.c##
  24. exit(0); /* never executed */## 23 ##src/advio/udpserv03.c##
  25. }## 24 ##src/advio/udpserv03.c##
  26. /* end udpserv1 */
  27. /* include udpserv2 */
  28. if (ifi->ifi_flags & IFF_BROADCAST) {## 25 ##src/advio/udpserv03.c##
  29. /* 4try to bind broadcast address */## 26 ##src/advio/udpserv03.c##
  30. sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 27 ##src/advio/udpserv03.c##
  31. Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 28 ##src/advio/udpserv03.c##
  32. sa = (struct sockaddr_in *) ifi->ifi_brdaddr;## 29 ##src/advio/udpserv03.c##
  33. sa->sin_family = AF_INET;## 30 ##src/advio/udpserv03.c##
  34. sa->sin_port = htons(SERV_PORT);## 31 ##src/advio/udpserv03.c##
  35. if (bind(sockfd, (SA *) sa, sizeof(*sa)) < 0) {## 32 ##src/advio/udpserv03.c##
  36. if (errno == EADDRINUSE) {## 33 ##src/advio/udpserv03.c##
  37. printf("EADDRINUSE: %s\n",## 34 ##src/advio/udpserv03.c##
  38. Sock_ntop((SA *) sa, sizeof(*sa)));## 35 ##src/advio/udpserv03.c##
  39. Close(sockfd);## 36 ##src/advio/udpserv03.c##
  40. continue;## 37 ##src/advio/udpserv03.c##
  41. } else## 38 ##src/advio/udpserv03.c##
  42. err_sys("bind error for %s",## 39 ##src/advio/udpserv03.c##
  43. Sock_ntop((SA *) sa, sizeof(*sa)));## 40 ##src/advio/udpserv03.c##
  44. }## 41 ##src/advio/udpserv03.c##
  45. printf("bound %s\n", Sock_ntop((SA *) sa, sizeof(*sa)));## 42 ##src/advio/udpserv03.c##
  46. if ((pid = Fork()) == 0) { /* child */## 43 ##src/advio/udpserv03.c##
  47. mydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr),## 44 ##src/advio/udpserv03.c##
  48. (SA *) sa);## 45 ##src/advio/udpserv03.c##
  49. exit(0); /* never executed */## 46 ##src/advio/udpserv03.c##
  50. }## 47 ##src/advio/udpserv03.c##
  51. }## 48 ##src/advio/udpserv03.c##
  52. }## 49 ##src/advio/udpserv03.c##
  53. /* end udpserv2 */
  54. /* include udpserv3 */
  55. /* 4bind wildcard address */## 50 ##src/advio/udpserv03.c##
  56. sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 51 ##src/advio/udpserv03.c##
  57. Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 52 ##src/advio/udpserv03.c##
  58. bzero(&wildaddr, sizeof(wildaddr));## 53 ##src/advio/udpserv03.c##
  59. wildaddr.sin_family = AF_INET;## 54 ##src/advio/udpserv03.c##
  60. wildaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 55 ##src/advio/udpserv03.c##
  61. wildaddr.sin_port = htons(SERV_PORT);## 56 ##src/advio/udpserv03.c##
  62. Bind(sockfd, (SA *) &wildaddr, sizeof(wildaddr));## 57 ##src/advio/udpserv03.c##
  63. printf("bound %s\n", Sock_ntop((SA *) &wildaddr, sizeof(wildaddr)));## 58 ##src/advio/udpserv03.c##
  64. if ((pid = Fork()) == 0) { /* child */## 59 ##src/advio/udpserv03.c##
  65. mydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), (SA *) sa);## 60 ##src/advio/udpserv03.c##
  66. exit(0); /* never executed */## 61 ##src/advio/udpserv03.c##
  67. }## 62 ##src/advio/udpserv03.c##
  68. exit(0);## 63 ##src/advio/udpserv03.c##
  69. }## 64 ##src/advio/udpserv03.c##
  70. /* end udpserv3 */
  71. /* include mydg_echo */
  72. void## 65 ##src/advio/udpserv03.c##
  73. mydg_echo(int sockfd, SA *pcliaddr, socklen_t clilen, SA *myaddr)## 66 ##src/advio/udpserv03.c##
  74. {## 67 ##src/advio/udpserv03.c##
  75. int n;## 68 ##src/advio/udpserv03.c##
  76. char mesg[MAXLINE];## 69 ##src/advio/udpserv03.c##
  77. socklen_t len;## 70 ##src/advio/udpserv03.c##
  78. for (;;) {## 71 ##src/advio/udpserv03.c##
  79. len = clilen;## 72 ##src/advio/udpserv03.c##
  80. n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);## 73 ##src/advio/udpserv03.c##
  81. printf("child %d, datagram from %s", getpid(),## 74 ##src/advio/udpserv03.c##
  82. Sock_ntop(pcliaddr, len));## 75 ##src/advio/udpserv03.c##
  83. printf(", to %s\n", Sock_ntop(myaddr, clilen));## 76 ##src/advio/udpserv03.c##
  84. Sendto(sockfd, mesg, n, 0, pcliaddr, len);## 77 ##src/advio/udpserv03.c##
  85. }## 78 ##src/advio/udpserv03.c##
  86. }## 79 ##src/advio/udpserv03.c##
  87. /* end mydg_echo */