“Hello Winsock!” HTTP server from first principles using Winsock (Windows 10)

Home   »   “Hello Winsock!” HTTP server from first principles using Winsock (Windows 10)

#undef UNICODE

#define WIN32_LEAN_AND_MEAN

#include 
#include 
#define _WIN32_WINNT 0x501
#include 
#include 
#include 

#define HTTP_PORT "80"

char const HELLO_WINSOCK[] =
  "HTTP/1.1 200 OK\r\n"
  "Content-Type: text/plain; charset=utf-8\r\n"
  "Content-Length: 16\r\n"
  "\r\n"
  "Hello Winsock!\r\n";

int __cdecl main(void) 
{
  WSADATA wsaData;
  int iResult;

  SOCKET ListenSocket = INVALID_SOCKET;
  SOCKET ClientSocket = INVALID_SOCKET;

  struct addrinfo *result = NULL;
  struct addrinfo hints;

  int iSendResult;
    
  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  if (iResult != 0) {
    printf("WSAStartup failed with error: %d\n", iResult);
    return 1;
  }

  ZeroMemory(&hints, sizeof(hints));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_protocol = IPPROTO_TCP;
  hints.ai_flags = AI_PASSIVE;

  // Resolve the server address and port
  iResult = getaddrinfo(NULL, HTTP_PORT, &hints, &result);
  if ( iResult != 0 ) {
    printf("getaddrinfo failed with error: %d\n", iResult);
    WSACleanup();
    return 1;
  }

  // Create a SOCKET for connecting to server
  ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
  if (ListenSocket == INVALID_SOCKET) {
    printf("socket failed with error: %ld\n", WSAGetLastError());
    freeaddrinfo(result);
    WSACleanup();
    return 1;
  }

  // Setup the TCP listening socket
  iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
  if (iResult == SOCKET_ERROR) {
    printf("bind failed with error: %d\n", WSAGetLastError());
    freeaddrinfo(result);
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
  }

  freeaddrinfo(result);

  iResult = listen(ListenSocket, SOMAXCONN);
  if (iResult == SOCKET_ERROR) {
    printf("listen failed with error: %d\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
  }

  while (1) {
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
      printf("accept failed with error: %d\n", WSAGetLastError());
      continue;
    }
    iSendResult = send(ClientSocket, HELLO_WINSOCK, sizeof(HELLO_WINSOCK), 0);
    if (iSendResult == SOCKET_ERROR) {
      printf("send failed with error: %d\n", WSAGetLastError());
    }
    iResult = shutdown(ClientSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
      printf("shutdown failed with error: %d\n", WSAGetLastError());
    }
    closesocket(ClientSocket);
  }

  return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *