udpservselect01.c 1.9 KB

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