Анализ HTTP-ответа только для сохранения пути к файлу и проверки, существует ли он - PullRequest
0 голосов
/ 01 мая 2020

Мой сервер работает нормально через localhost, порт 8080. Я получаю ответ:

GET /C:/ HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.*.****.129 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

Мне все равно, кроме первой строки, после GET. Путь к файлу, который я печатаю в своем браузере, отвечает серверу, и мне нужно использовать только путь к файлу и проверить, существует ли файл на моем локальном компьютере или нет. (Здесь у меня есть только http://localhost: 8080 / C: / , как вы можете видеть в ответе клиента). По сути, мой браузер - это мой клиент, и я создаю сервер. Ответ клиента хранится в переменной буфера. Вот мой код:

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <netinet/in.h>
#include <string.h>

#define PORT 8080
char fail_message[] = "failure";
char buffer[4096] = {0};
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void failure(char message)
{
    printf("%d", message);
    exit(EXIT_FAILURE);
}


void * socketThread(void *arg)
{
  int newSocket = *((int *)arg);
  recv(newSocket , buffer , 4096 , 0);
  // Send message to the client socket 
  pthread_mutex_lock(&lock);
  //secluding URL from response and processing it here <----
  //printf("CLIENT MESSAGE:\n %s\n", buffer);
  pthread_mutex_unlock(&lock);
  sleep(1);
  send(newSocket,buffer,13,0);
  printf("Exiting current socket Thread \n");
  close(newSocket);
  pthread_exit(NULL);
}

void exists(const char *fname)
{
    if( access( fname, F_OK ) != -1 ) 
    {
        printf("HTTP/1.0 200 OK");

    } 
    else 
    {
    failure(fail_message == "ERROR 404 FILE DOES NOT EXIST");
    }
}

int main()
{
    int server_fd, new_socket, i, bytes; 
    pthread_t tid[60];
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char response[30000] = "HTTP/1.1";

    // Creating socket file descriptor
    if ((server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0)
    {
        failure(fail_message == "Failed to create Socket\n");
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons( PORT );
    memset(address.sin_zero, '\0', sizeof address.sin_zero);


    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0)
    {
        failure(fail_message == "Failed to bind\n");
    }
    if (listen(server_fd, 10) < 0)
    {
        failure(fail_message == "Server Failed to listen\n");
    }
    while(1)
    {
        printf("\nWaiting for new connection\n\n");
        if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0)
        {
            failure(fail_message == "Failed to accept connection");
        }

        read(new_socket , buffer, 4096);
        printf("buffer: %s\n",buffer);

        if(server_fd > -1)
        {
          printf("\nConnection Accepted\n");
          bytes = write(new_socket , response, strlen(response));
          printf("CONTENT LENGTH: %d\n\n", bytes);
        }

        if( pthread_create(&tid[i], NULL, socketThread, &new_socket) != 0 )
           printf("Failed to create thread\n");
        if( i >= 50)
        {
          i = 0;
          while(i < 50)
          {
            pthread_join(tid[i++],NULL);
          }
          i = 0;
        }

        close(new_socket);
    }
    return 0;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...