sample_httpd.c
上传用户:sxxjsc
上传日期:2022-08-08
资源大小:5k
文件大小:2k
源码类别:

网络编程

开发平台:

Visual C++

  1. /**
  2.   @file sample_httpd.c
  3.   @author Kevin Lynx
  4.   @brief sample httpd, just for testing purpose.
  5. */
  6. #include <winsock2.h>
  7. #include <stdio.h>
  8. void http_response( SOCKET con, const char *request )
  9. {
  10. /* get the method */
  11. char *token = strtok( request, " " );
  12. char *uri = strtok( 0, " " );
  13. char file[64];
  14. sprintf( file, ".%s", uri );
  15. {
  16. /* load the file content */
  17. FILE *fp = fopen( file, "rb" );
  18. if( fp == 0 )
  19. {
  20. /* response 404 status code */
  21. char response[] = "HTTP/1.1 404 NOT FOUNDrnrn";
  22. send( con, response, strlen( response ), 0 );
  23. }
  24. else
  25. {
  26. /* response the resource */
  27. /* first, load the file */
  28. int file_size ;
  29. char *content;
  30. char response[1024];
  31. fseek( fp, 0, SEEK_END );
  32. file_size = ftell( fp );
  33. fseek( fp, 0, SEEK_SET );
  34. content = (char*)malloc( file_size + 1 );
  35. fread( content, file_size, 1, fp );
  36. content[file_size] = 0;
  37. sprintf( response, "HTTP/1.1 200 OKrnContent-Type: text/htmlrnContent-Length: %drnrn%s", file_size, content );
  38. send( con, response, strlen( response ), 0 );
  39. free( content );
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. WSADATA wd;
  46. int ret;
  47. SOCKET s;
  48. ret = WSAStartup( MAKEWORD( 2, 0 ), &wd );
  49. if( ret < 0 )
  50. {
  51. fprintf( stderr, "winsock startup failedn" );
  52. exit( -1 );
  53. }
  54. s = socket( AF_INET, SOCK_STREAM, 0 );
  55. {
  56. /* bind and listen */
  57. struct sockaddr_in addr;
  58. memset( &addr, 0, sizeof( addr ) );
  59. addr.sin_family = AF_INET;
  60. addr.sin_port = htons( 80 );
  61. addr.sin_addr.s_addr = inet_addr( "0.0.0.0" );
  62. ret = bind( s, (struct sockaddr*)&addr, sizeof( addr ) );
  63. if( ret < 0 )
  64. {
  65. fprintf( stderr, "bind failedn" );
  66. closesocket( s );
  67. exit( -1 );
  68. }
  69. ret = listen( s, 1024 );
  70. if( ret < 0 )
  71. {
  72. fprintf( stderr, "listen failedn" );
  73. closesocket( s );
  74. exit( -1 );
  75. }
  76. }
  77. {
  78. SOCKET con = accept( s, 0, 0 );
  79. /* recv request */
  80. char request[1024] = { 0 };
  81. ret = recv( con, request, sizeof( request ), 0 );
  82. printf( request );
  83. http_response( con, request );
  84. closesocket( con );
  85. }
  86. closesocket( s );
  87. WSACleanup();
  88. return 0;
  89. }