udpservselect01.lc 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* include udpservselect01 */
  2. #include "unp.h"## 1 ##src/udpcliserv/udpservselect01.c##
  3. int## 2 ##src/udpcliserv/udpservselect01.c##
  4. main(int argc, char **argv)## 3 ##src/udpcliserv/udpservselect01.c##
  5. {## 4 ##src/udpcliserv/udpservselect01.c##
  6. int listenfd, connfd, udpfd, nready, maxfdp1;## 5 ##src/udpcliserv/udpservselect01.c##
  7. char mesg[MAXLINE];## 6 ##src/udpcliserv/udpservselect01.c##
  8. pid_t childpid;## 7 ##src/udpcliserv/udpservselect01.c##
  9. fd_set rset;## 8 ##src/udpcliserv/udpservselect01.c##
  10. ssize_t n;## 9 ##src/udpcliserv/udpservselect01.c##
  11. socklen_t len;## 10 ##src/udpcliserv/udpservselect01.c##
  12. const int on = 1;## 11 ##src/udpcliserv/udpservselect01.c##
  13. struct sockaddr_in cliaddr, servaddr;## 12 ##src/udpcliserv/udpservselect01.c##
  14. void sig_chld(int);## 13 ##src/udpcliserv/udpservselect01.c##
  15. /* 4create listening TCP socket */## 14 ##src/udpcliserv/udpservselect01.c##
  16. listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 15 ##src/udpcliserv/udpservselect01.c##
  17. bzero(&servaddr, sizeof(servaddr));## 16 ##src/udpcliserv/udpservselect01.c##
  18. servaddr.sin_family = AF_INET;## 17 ##src/udpcliserv/udpservselect01.c##
  19. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 18 ##src/udpcliserv/udpservselect01.c##
  20. servaddr.sin_port = htons(SERV_PORT);## 19 ##src/udpcliserv/udpservselect01.c##
  21. Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 20 ##src/udpcliserv/udpservselect01.c##
  22. Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 21 ##src/udpcliserv/udpservselect01.c##
  23. Listen(listenfd, LISTENQ);## 22 ##src/udpcliserv/udpservselect01.c##
  24. /* 4create UDP socket */## 23 ##src/udpcliserv/udpservselect01.c##
  25. udpfd = Socket(AF_INET, SOCK_DGRAM, 0);## 24 ##src/udpcliserv/udpservselect01.c##
  26. bzero(&servaddr, sizeof(servaddr));## 25 ##src/udpcliserv/udpservselect01.c##
  27. servaddr.sin_family = AF_INET;## 26 ##src/udpcliserv/udpservselect01.c##
  28. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 27 ##src/udpcliserv/udpservselect01.c##
  29. servaddr.sin_port = htons(SERV_PORT);## 28 ##src/udpcliserv/udpservselect01.c##
  30. Bind(udpfd, (SA *) &servaddr, sizeof(servaddr));## 29 ##src/udpcliserv/udpservselect01.c##
  31. /* end udpservselect01 */
  32. /* include udpservselect02 */
  33. Signal(SIGCHLD, sig_chld); /* must call waitpid() */## 30 ##src/udpcliserv/udpservselect01.c##
  34. FD_ZERO(&rset);## 31 ##src/udpcliserv/udpservselect01.c##
  35. maxfdp1 = max(listenfd, udpfd) + 1;## 32 ##src/udpcliserv/udpservselect01.c##
  36. for (;;) {## 33 ##src/udpcliserv/udpservselect01.c##
  37. FD_SET(listenfd, &rset);## 34 ##src/udpcliserv/udpservselect01.c##
  38. FD_SET(udpfd, &rset);## 35 ##src/udpcliserv/udpservselect01.c##
  39. if ((nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {## 36 ##src/udpcliserv/udpservselect01.c##
  40. if (errno == EINTR)## 37 ##src/udpcliserv/udpservselect01.c##
  41. continue; /* back to for() */## 38 ##src/udpcliserv/udpservselect01.c##
  42. else## 39 ##src/udpcliserv/udpservselect01.c##
  43. err_sys("select error");## 40 ##src/udpcliserv/udpservselect01.c##
  44. }## 41 ##src/udpcliserv/udpservselect01.c##
  45. if (FD_ISSET(listenfd, &rset)) {## 42 ##src/udpcliserv/udpservselect01.c##
  46. len = sizeof(cliaddr);## 43 ##src/udpcliserv/udpservselect01.c##
  47. connfd = Accept(listenfd, (SA *) &cliaddr, &len);## 44 ##src/udpcliserv/udpservselect01.c##
  48. if ((childpid = Fork()) == 0) { /* child process */## 45 ##src/udpcliserv/udpservselect01.c##
  49. Close(listenfd); /* close listening socket */## 46 ##src/udpcliserv/udpservselect01.c##
  50. str_echo(connfd); /* process the request */## 47 ##src/udpcliserv/udpservselect01.c##
  51. exit(0);## 48 ##src/udpcliserv/udpservselect01.c##
  52. }## 49 ##src/udpcliserv/udpservselect01.c##
  53. Close(connfd); /* parent closes connected socket */## 50 ##src/udpcliserv/udpservselect01.c##
  54. }## 51 ##src/udpcliserv/udpservselect01.c##
  55. if (FD_ISSET(udpfd, &rset)) {## 52 ##src/udpcliserv/udpservselect01.c##
  56. len = sizeof(cliaddr);## 53 ##src/udpcliserv/udpservselect01.c##
  57. n = Recvfrom(udpfd, mesg, MAXLINE, 0, (SA *) &cliaddr, &len);## 54 ##src/udpcliserv/udpservselect01.c##
  58. Sendto(udpfd, mesg, n, 0, (SA *) &cliaddr, len);## 55 ##src/udpcliserv/udpservselect01.c##
  59. }## 56 ##src/udpcliserv/udpservselect01.c##
  60. }## 57 ##src/udpcliserv/udpservselect01.c##
  61. }## 58 ##src/udpcliserv/udpservselect01.c##
  62. /* end udpservselect02 */