Мой сервер работает нормально через 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;
}