web.lc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* include web1 */
  2. #include "web.h"## 1 ##src/nonblock/web.c##
  3. int## 2 ##src/nonblock/web.c##
  4. main(int argc, char **argv)## 3 ##src/nonblock/web.c##
  5. {## 4 ##src/nonblock/web.c##
  6. int i, fd, n, maxnconn, flags, error;## 5 ##src/nonblock/web.c##
  7. char buf[MAXLINE];## 6 ##src/nonblock/web.c##
  8. fd_set rs, ws;## 7 ##src/nonblock/web.c##
  9. if (argc < 5)## 8 ##src/nonblock/web.c##
  10. err_quit("usage: web <#conns> <hostname> <homepage> <file1> ...");## 9 ##src/nonblock/web.c##
  11. maxnconn = atoi(argv[1]);## 10 ##src/nonblock/web.c##
  12. nfiles = min(argc - 4, MAXFILES);## 11 ##src/nonblock/web.c##
  13. for (i = 0; i < nfiles; i++) {## 12 ##src/nonblock/web.c##
  14. file[i].f_name = argv[i + 4];## 13 ##src/nonblock/web.c##
  15. file[i].f_host = argv[2];## 14 ##src/nonblock/web.c##
  16. file[i].f_flags = 0;## 15 ##src/nonblock/web.c##
  17. }## 16 ##src/nonblock/web.c##
  18. printf("nfiles = %d\n", nfiles);## 17 ##src/nonblock/web.c##
  19. home_page(argv[2], argv[3]);## 18 ##src/nonblock/web.c##
  20. FD_ZERO(&rset);## 19 ##src/nonblock/web.c##
  21. FD_ZERO(&wset);## 20 ##src/nonblock/web.c##
  22. maxfd = -1;## 21 ##src/nonblock/web.c##
  23. nlefttoread = nlefttoconn = nfiles;## 22 ##src/nonblock/web.c##
  24. nconn = 0;## 23 ##src/nonblock/web.c##
  25. /* end web1 */
  26. /* include web2 */
  27. while (nlefttoread > 0) {## 24 ##src/nonblock/web.c##
  28. while (nconn < maxnconn && nlefttoconn > 0) {## 25 ##src/nonblock/web.c##
  29. /* 4find a file to read */## 26 ##src/nonblock/web.c##
  30. for (i = 0; i < nfiles; i++)## 27 ##src/nonblock/web.c##
  31. if (file[i].f_flags == 0)## 28 ##src/nonblock/web.c##
  32. break;## 29 ##src/nonblock/web.c##
  33. if (i == nfiles)## 30 ##src/nonblock/web.c##
  34. err_quit("nlefttoconn = %d but nothing found", nlefttoconn);## 31 ##src/nonblock/web.c##
  35. start_connect(&file[i]);## 32 ##src/nonblock/web.c##
  36. nconn++;## 33 ##src/nonblock/web.c##
  37. nlefttoconn--;## 34 ##src/nonblock/web.c##
  38. }## 35 ##src/nonblock/web.c##
  39. rs = rset;## 36 ##src/nonblock/web.c##
  40. ws = wset;## 37 ##src/nonblock/web.c##
  41. n = Select(maxfd + 1, &rs, &ws, NULL, NULL);## 38 ##src/nonblock/web.c##
  42. for (i = 0; i < nfiles; i++) {## 39 ##src/nonblock/web.c##
  43. flags = file[i].f_flags;## 40 ##src/nonblock/web.c##
  44. if (flags == 0 || flags & F_DONE)## 41 ##src/nonblock/web.c##
  45. continue;## 42 ##src/nonblock/web.c##
  46. fd = file[i].f_fd;## 43 ##src/nonblock/web.c##
  47. if (flags & F_CONNECTING &&## 44 ##src/nonblock/web.c##
  48. (FD_ISSET(fd, &rs) || FD_ISSET(fd, &ws))) {## 45 ##src/nonblock/web.c##
  49. n = sizeof(error);## 46 ##src/nonblock/web.c##
  50. if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &n) < 0 ||## 47 ##src/nonblock/web.c##
  51. error != 0) {## 48 ##src/nonblock/web.c##
  52. err_ret("nonblocking connect failed for %s",## 49 ##src/nonblock/web.c##
  53. file[i].f_name);## 50 ##src/nonblock/web.c##
  54. }## 51 ##src/nonblock/web.c##
  55. /* 4connection established */## 52 ##src/nonblock/web.c##
  56. printf("connection established for %s\n", file[i].f_name);## 53 ##src/nonblock/web.c##
  57. FD_CLR(fd, &wset); /* no more writeability test */## 54 ##src/nonblock/web.c##
  58. write_get_cmd(&file[i]); /* write() the GET command */## 55 ##src/nonblock/web.c##
  59. } else if (flags & F_READING && FD_ISSET(fd, &rs)) {## 56 ##src/nonblock/web.c##
  60. if ((n = Read(fd, buf, sizeof(buf))) == 0) {## 57 ##src/nonblock/web.c##
  61. printf("end-of-file on %s\n", file[i].f_name);## 58 ##src/nonblock/web.c##
  62. Close(fd);## 59 ##src/nonblock/web.c##
  63. file[i].f_flags = F_DONE; /* clears F_READING */## 60 ##src/nonblock/web.c##
  64. FD_CLR(fd, &rset);## 61 ##src/nonblock/web.c##
  65. nconn--;## 62 ##src/nonblock/web.c##
  66. nlefttoread--;## 63 ##src/nonblock/web.c##
  67. } else {## 64 ##src/nonblock/web.c##
  68. printf("read %d bytes from %s\n", n, file[i].f_name);## 65 ##src/nonblock/web.c##
  69. }## 66 ##src/nonblock/web.c##
  70. }## 67 ##src/nonblock/web.c##
  71. }## 68 ##src/nonblock/web.c##
  72. }## 69 ##src/nonblock/web.c##
  73. exit(0);## 70 ##src/nonblock/web.c##
  74. }## 71 ##src/nonblock/web.c##
  75. /* end web2 */