test_klhttpd.c
上传用户:jnmzc84
上传日期:2022-08-08
资源大小:35k
文件大小:2k
源码类别:

网络编程

开发平台:

Visual C++

  1. /**
  2. */
  3. #include "klhttp.h"
  4. #include "klhttp-internal.h"
  5. #include <stdio.h>
  6. #ifdef WIN32
  7. #include <winsock2.h>
  8. #endif
  9. /**
  10.   get file size
  11. */
  12. int get_file_size( FILE *fp )
  13. {
  14. int file_size ;
  15. fseek( fp, 0, SEEK_END );
  16. file_size = ftell( fp );
  17. fseek( fp, 0, SEEK_SET );
  18. return file_size;
  19. }
  20. /**
  21.   resource file load.
  22. */
  23. int load_file( const char *uri, struct evbuffer *buf )
  24. {
  25. char file[260];
  26. FILE *fp;
  27. int file_size;
  28. char *data;
  29. if( strcmp( uri, "/" ) == 0 )
  30. {
  31. strcpy( file, "./www/index.html" );
  32. }
  33. else
  34. {
  35. sprintf( file, "./www%s", uri );
  36. }
  37. fp = fopen( file, "rb" );
  38. if( fp == 0 )
  39. {
  40. return -1;
  41. }
  42. file_size = get_file_size( fp );
  43. data = (char*) malloc( file_size );
  44. fread( data, file_size, 1, fp );
  45. evbuffer_add( buf, data, file_size );
  46. free( data );
  47. fclose( fp );
  48. return file_size;
  49. }
  50. int file_exist( const char *uri )
  51. {
  52. char file[256];
  53. FILE *fp;
  54. int file_size;
  55. if( strcmp( uri, "/" ) == 0 )
  56. {
  57. strcpy( file, "./www/index.html" );
  58. }
  59. else
  60. {
  61. sprintf( file, "./www%s", uri );
  62. }
  63. fp = fopen( file, "rb" );
  64. if( fp == 0 )
  65. {
  66. return -1;
  67. }
  68. file_size = get_file_size( fp );
  69. fclose( fp );
  70. return file_size;
  71. }
  72. void handle_request( struct http_connection *conn, const struct http_request *request, void *arg )
  73. {
  74. http_handle_request( conn->outbuf, request, file_exist, load_file );
  75. }
  76. void info_log( const char *msg )
  77. {
  78. printf( "%sn", msg );
  79. }
  80. volatile int is_done = 0;  
  81. /**
  82.   handle the ctrl+c event.
  83. */
  84. #ifdef WIN32
  85. BOOL WINAPI Handler( DWORD ctrl_event )
  86. {
  87. switch( ctrl_event )
  88. {
  89. case CTRL_CLOSE_EVENT:
  90. case CTRL_C_EVENT:
  91. {
  92. /* shutdown the server */
  93. is_done = 1;
  94. }
  95. return TRUE;
  96. }
  97. return FALSE;
  98. }
  99. #endif
  100. int main()
  101. {
  102. struct http_server *httpd;
  103. struct timeval timeout = { 2, 0 };
  104. #ifdef WIN32
  105. {
  106. WSADATA wd;
  107. WSAStartup( MAKEWORD( 2, 0 ), &wd );
  108. }
  109. #endif
  110. #ifdef WIN32
  111. if( !SetConsoleCtrlHandler( Handler, TRUE ) )
  112. {
  113. fprintf( stderr, "error setting event handler.n" );
  114. return -1;
  115. }
  116. #endif
  117. http_set_info_log( info_log );
  118. httpd = http_start( "0.0.0.0", 8080, 1024 );
  119. http_set_rcb( httpd, handle_request, 0 );
  120. printf( "server startupn" );
  121. while( is_done == 0 )
  122. {
  123. http_poll( httpd, &timeout );
  124. }
  125. http_free( httpd );
  126. #ifdef WIN32
  127. WSACleanup();
  128. #endif
  129. printf( "server shutdownn" );
  130. return 0;
  131. }