Skip to content

Instantly share code, notes, and snippets.

@flysand7
Created September 24, 2021 18:26
Show Gist options
  • Save flysand7/0ac34bf6decc809a57f77fb2850a8571 to your computer and use it in GitHub Desktop.
Save flysand7/0ac34bf6decc809a57f77fb2850a8571 to your computer and use it in GitHub Desktop.
Ultra minimal HTTP web server with winsock 2.
#include<stdbool.h>
#include<stdio.h>
#define WIN32_LEAN_AND_MEAN
#include<Winsock2.h>
#include<Ws2tcpip.h>
#define nil ((void *)0)
#define kb 1024
char response[] =
"HTTP/1.1 200 OK\r\n\
\r\n\
<!DOCTYPE html><html>\
<head><title>Hello, Web</title></head>\
<body>\
<h1>My webserver</h1>\
<p>Simple text</p>\
</body>\
</html>";
int main(void) {
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
SOCKET listenSocket;
{
ADDRINFOA *serverAddr;
ADDRINFOA serverHints = {
.ai_flags = AI_PASSIVE,
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM,
.ai_protocol = IPPROTO_TCP,
};
getaddrinfo(nil, "80", &serverHints, &serverAddr);
listenSocket = socket(serverAddr->ai_family,
serverAddr->ai_socktype,
serverAddr->ai_protocol);
bind(listenSocket, serverAddr->ai_addr, (int)serverAddr->ai_addrlen);
freeaddrinfo(serverAddr);
}
printf("Listening... Connect on http://localhost:80\n");
listen(listenSocket, SOMAXCONN);
while(true) {
SOCKET clientSocket = accept(listenSocket, nil, nil);
char buffer[4*kb];
int received = recv(clientSocket, buffer, sizeof buffer, 0);
if(received > 0) {
send(clientSocket, response, sizeof response, 0);
}
shutdown(clientSocket, SD_SEND);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment