向网络浏览器提供名为“ index.html”的默认网页

时间:2020-10-20 10:14:05

标签: c++

#include <stdio.h>            
#include <stdlib.h>       
#include <string.h>         
#include <windows.h>      
#include <stddef.h>        
#include <process.h>      
#include <fcntl.h>       
#include <sys\stat.h>      
#include <fstream>              

#define OK_IMAGE  "HTTP/1.0 200 OK\r\nContent-Type:image/gif\r\n\r\n"
#define OK_TEXT   "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n"
#define NOTOK_404 "HTTP/1.0 404 Not Found\r\nContent-Type:text/html\r\n\r\n"
#define MESS_404  "<html><body><h1>FILE NOT FOUND</h1></body></html>"

#define  BUF_SIZE 1024    

#define  PORT_NUM 80              

int      Count;                 

void handle_get(void *in_arg);       
void do_end(void *server_s);        

void main()
{
  unsigned int         server_s;             // Server socket descriptor
  struct sockaddr_in   server_addr;          // Server Internet address
  unsigned int         client_s;             // Client socket descriptor
  struct sockaddr_in   client_addr;          // Client Internet address
  int                  addr_len;             // Internet address length


  WSADATA wsaData;
  WSAStartup(MAKEWORD(1,1), &wsaData);  

  server_s = socket(AF_INET, SOCK_STREAM, 0);       
  server_addr.sin_family      = AF_INET;            
  server_addr.sin_port        = htons(PORT_NUM);  
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
  bind(server_s, (struct sockaddr *)&server_addr, sizeof(server_addr));

  printf("HTTP Server Start.(Stop:ESC)\n");

  if (_beginthread(do_end, 0, (void*)&server_s) < 0) {
    printf("ERROR - Unable to create thread \n");
    exit(1);
  }

 
  while(1)
  {
 
    listen(server_s, 50);
    addr_len = sizeof(client_addr);


    client_s = accept(server_s, (struct sockaddr*)&client_addr, addr_len);
    if (client_s == -1)
    {
      printf("ERROR - Unable to create a socket \n");
      exit(1);
    }
    
    Count++;
    if (client_s == -1) {
      if(server_s) printf("ERROR - Unable to create a socket \n");
      exit(1);
    }

  
    if (_beginthread(handle_get, 0, (void *)client_s) < 0)
    {
      printf("ERROR - Unable to create a thread to handle the GET \n");
      exit(1);
    }
  }
  
}


void handle_get(void *in_arg)
{
  unsigned int   client_s;            
  char           in_buf[BUF_SIZE];     
  char           out_buf[BUF_SIZE];  
  int            fh;                  
  int            buf_len;             
  char           command[BUF_SIZE];   
  char           file_name[BUF_SIZE];  
  int            retcode;             
  int            i;                    


  client_s = (unsigned int) in_arg;

  retcode = recv(client_s, in_buf, BUF_SIZE, 0);

  if (retcode <= 0)
  {
    printf("ERROR - Receive failed --- probably due to dropped connection \n");
    Count--;
    closesocket(client_s);
    _endthread();
  }

  for (i=0; i<retcode; i++)
    printf ("%c", in_buf[i]);

  sscanf(in_buf, "%s %s \n", command, file_name);

  if (strcmp(command, "GET") != 0) {
    printf("ERROR - Not a GET --- received command = '%s' \n", command);
    Count--;
    closesocket(client_s);
    _endthread();
  }

 

  if(file_name[1]=='\0') {
      strcpy(file_name[1], "index.htm");
      fh = open(file_name[1], O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
       
    
  
  }
  else 
      fh = open(&file_name[1], O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);

  if (fh == -1) {
    printf("File '%s' not found --- sending an HTTP 404 \n", &file_name[1]);
    strcpy(out_buf, NOTOK_404);
    send(client_s, out_buf, strlen(out_buf), 0);
    strcpy(out_buf, MESS_404);
    send(client_s, out_buf, strlen(out_buf), 0);
    Count--;
    closesocket(client_s);
    _endthread();
  }
  

  if (((file_name[1] == '.') && (file_name[2] == '.')) ||
       (file_name[1] == '/') || (file_name[1] == '\\') ||
       (file_name[2] == ':'))
  {
    printf("SECURITY VIOLATION --- trying to read '%s' \n", &file_name[1]);
    Count--;
    close(fh);
    closesocket(client_s);
    _endthread();
  }

  printf("Sending file '%s' \n\n\n", &file_name[1]);

  if (strstr(file_name, ".gif") != NULL)
    strcpy(out_buf, OK_IMAGE);
  else
    strcpy(out_buf, OK_TEXT);

  send(client_s, out_buf, strlen(out_buf), 0);

  while(!eof(fh)) {
    buf_len = read(fh, out_buf, BUF_SIZE);
    send(client_s, out_buf, buf_len, 0);


  }

  Count--;
  close(fh);
  closesocket(client_s);
  _endthread();
}

void do_end(void *server_s)
{
    unsigned int    temp;
    temp = *((unsigned int*)server_s);

    while(getch()!=27);
    while(Count);
    *((unsigned int*)server_s) = 0;

    printf("HTTP Server Stop.\n");
    closesocket(temp);

    WSACleanup();
    exit(1);

这是一个例程,如果上面的if语句未指定任何文件名,则该程序允许用户首先发送“ index.htm”文件。 (如果当前服务器的文件名为“ index.html”而不是此文件,则会出现问题。)

file_name [1]包含所请求文件的名称。

但是,如果服务器上当前存在一个名为“ index.html”的文件,并且用户未命名该文件,该如何为Web浏览器提供一个名为“ index.html”的默认页面?

 if(file_name[1]=='\0') {
      strcpy(file_name[1], "index.htm");
      fh = open(file_name[1], O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);

  }

2 个答案:

答案 0 :(得分:0)

考虑到它是Windows(给定#include <windows.h>),最简单的解决方案是什么也不做。打开index.html时发现index.htm,因为后者是index.html的8.3名称。

答案 1 :(得分:-1)

您需要做的就是检查sscanf()的返回值,该值告诉您读取了多少个令牌。

相关问题