logparse.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:2k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include "logparse.h"
  9. // Read next line into file
  10. int lf_get_next_entry(FILE *fp, lf_entry &ne)
  11. {
  12. char buf[MAXBUF]; // must be large enough for a cache log
  13. if ((fgets(buf, MAXBUF, fp) == NULL) || feof(fp) || ferror(fp)) {
  14. return 1;
  15. }
  16. // Parse a line and fill an lf_entry
  17. char *p = buf, *q, *tmp1, *tmp2, *ret_code;
  18. u_int32_t lapse;
  19. // first two entries: <TimeStamp> and <Elapsed Time>
  20. q = strtok(p, " ");
  21. ne.rt = strtod(q, NULL);
  22. q = strtok(NULL, " ");
  23. lapse = strtoul(q, NULL, 10);
  24. ne.rt -= (double)lapse/1000.0;
  25. // Client address
  26. q = strtok(NULL, " ");
  27. ne.cid = (u_int32_t)inet_addr(q);
  28. // Log tags, do not store them but use it to filter entries
  29. ret_code = strtok(NULL, " ");
  30. if (ret_code == NULL) { abort(); } 
  31. // XXX Have to handle this return code in the end because we are using
  32. // strtok() and it cannot interleave two strings :( STUPID!!
  33. // Page size
  34. q = strtok(NULL, " "); 
  35. ne.size = strtoul(q, NULL, 10);
  36. // Request method, GET only
  37. q = strtok(NULL, " ");
  38. if (strcmp(q, "GET") != 0) 
  39. return -1;
  40. // URL
  41. q = strtok(NULL, " ");
  42. if (q == NULL) abort(); 
  43. if (strchr(q, '?') != NULL) 
  44. // Do not accept any URL containing '?'
  45. return -1;
  46. ne.url = new char[strlen(q) + 1];
  47. strcpy(ne.url, q);
  48. // Try to locate server name from the URL
  49. // XXX no more parsing from the original string!!!!
  50. tmp1 = strtok(q, "/");
  51. if (strcmp(tmp1, "http:") != 0) {
  52. // How come this isn't a http request???
  53. delete []ne.url;
  54. return -1;
  55. }
  56. tmp1 = strtok(NULL, "/"); 
  57. if (tmp1 == NULL) abort();
  58. ne.sid = new char[strlen(tmp1) + 1];
  59. strcpy(ne.sid, tmp1);
  60. // Now check return codes
  61. if (ret_code == NULL) abort();
  62. tmp1 = new char[strlen(ret_code)+1];
  63. strcpy(tmp1, ret_code);
  64. tmp2 = strtok(tmp1, "/");
  65. tmp2 += 4; // Ignore the first 4 char "TCP_"
  66. if ((strcmp(tmp2, "MISS") == 0) || 
  67.     (strcmp(tmp2, "CLIENT_REFRESH_MISS") == 0) || 
  68.     (strcmp(tmp2, "IMS_MISS") == 0) || 
  69.     (strcmp(tmp2, "DENIED") == 0)) {
  70. delete []ne.url;
  71. delete []ne.sid;
  72. delete []tmp1;
  73. return -1; // Return negative to discard this entry
  74. }
  75. delete []tmp1;
  76. // All the rest are useless, do not parse them
  77. return 0;
  78. }