// server.c
#ifdef _WIN32
#define _WIN32_WINNT 0x0601
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SOCKET int
#define INVALID_SOCKET -1
#define closesocket close
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
#ifdef _WIN32
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
#endif
SOCKET server_sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr = {
.sin_family = AF_INET,
.sin_port = htons(8080),
.sin_addr.s_addr = INADDR_ANY
};
bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(server_sock, 5);
while (1) {
SOCKET client_sock = accept(server_sock, NULL, NULL);
if (client_sock == INVALID_SOCKET) continue;
char buffer[1024] = {0};
recv(client_sock, buffer, sizeof(buffer) - 1, 0);
printf("Message:\n%s\n", buffer);
if (strncmp(buffer, "GET / ", 6) == 0 || strncmp(buffer, "GET /index.html", 15) == 0) {
FILE* f = fopen("index.html", "rb");
if (f) {
fseek(f, 0, SEEK_END);
long filesize = ftell(f);
rewind(f);
char* filebuf = malloc(filesize);
fread(filebuf, 1, filesize, f);
fclose(f);
char header[256];
int header_len = snprintf(
header, sizeof(header),
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Content-Length: %ld\r\n"
"\r\n",
filesize
);
send(client_sock, header, header_len, 0);
send(client_sock, filebuf, filesize, 0);
free(filebuf);
} else {
const char* not_found = "HTTP/1.1 404 Not Found\r\nContent-Length: 9\r\n\r\nNot Found";
send(client_sock, not_found, (int)strlen(not_found), 0);
}
} else {
const char* not_found = "HTTP/1.1 404 Not Found\r\nContent-Length: 9\r\n\r\nNot Found";
send(client_sock, not_found, (int)strlen(not_found), 0);
}
closesocket(client_sock);
}
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}