심심해서 만들어본 http 서버

HTTP기반 웹 서버의 기본 원리가 TCP/IP 위에 HTTP 프로토콜로 돌아가는 것을 보여주려고 만들어봤습니다.

#include <WS2tcpip.h>
#include <Windows.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

#define LISTEN_PORT	(50001)
#define LISTEN_IP	L"0.0.0.0"

int main()
{
	WSADATA wsa;
	int wsa_startup_result = WSAStartup(MAKEWORD(2, 2), &wsa);
	if (wsa_startup_result != 0)
	{
		int error = WSAGetLastError();
		wprintf(L"Failed WSAStartup. code : %d", error);

		return 1;
	}

	SOCKADDR_IN server_address;
	memset(&server_address, 0, sizeof server_address);
	server_address.sin_family = AF_INET;
	server_address.sin_port = htons(LISTEN_PORT);
	int inet_pton_result = InetPton(AF_INET, LISTEN_IP, &server_address.sin_addr);
	if (inet_pton_result != 1)
	{
		if (inet_pton_result == 0)
		{
			wprintf(L"Failed InetPton. invalid IP string");
		}
		else
		{
			int error = WSAGetLastError();
			wprintf(L"Failed InetPton. code : %d", error);
		}

		return 1;
	}

	SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (listen_socket == INVALID_SOCKET)
	{
		int error = WSAGetLastError();
		wprintf(L"Failed socket. code : %d", error);

		return 1;
	}

	int bind_result = bind(listen_socket, (struct sockaddr*)&server_address, sizeof server_address);
	if (bind_result != 0)
	{
		int error = WSAGetLastError();
		wprintf(L"Failed bind. code : %d", error);

		return 1;
	}

	int listen_result = listen(listen_socket, SOMAXCONN);
	if (listen_result != 0)
	{
		int error = WSAGetLastError();
		wprintf(L"Failed listen. code : %d", error);

		return 1;
	}

	while (1)
	{
		SOCKADDR_IN client_address;
		int client_address_size = sizeof client_address;
		SOCKET connected_socket = accept(listen_socket, (struct sockaddr*)&client_address, &client_address_size);
		if (connected_socket == INVALID_SOCKET)
		{
			int error = WSAGetLastError();
			wprintf(L"Failed accept. code : %d", error);

			continue;
		}

		char* body = "<html><body><p>Hello world</p></body></html>";
		char* header = "HTTP/1.1 200 OK\nContent-Length: 45\nContent-Type: text/html\n\n";

		send(connected_socket, header, strlen(header), 0);
		send(connected_socket, body, strlen(body), 0);
		
		Sleep(10);
		closesocket(connected_socket);
	}

	return 0;
}

실행해서 브라우저에서 띄우면 이렇습니다.

다음엔 라우팅 기능도 넣어보고 그래봐야겠네요.

5 Likes

C언어로 서버를 만들수가 있네요??? 처음알았어요

image

안 되는 건 없죠… 제가 못해서 그렇지

대부분 언어들에 대한 컴파일러/런타임이 C/C++로 구현이 되어 있어서, 사실상 대부분 언어에서 지원되는 기능들은 C/C++로 구현 가능하다고 보시면 됩니다.

개발 공수 및 유지보수 비용 이슈로 인해 비용이 저렴한 환경을 택할 뿐이죠.

오, 이런 관심을 받을 줄이야!

1 Like

심심해서 서버를 만드실 수 있군요…ㄷㄷㄷ
c로 되는건 처음 본거 같습니다 신기하네요

와… C 언어로 서버를 만들수 있다니… 잘하면 C 언어로 게임같은것들도 만들수 있겠는데요…?
잠깐만… 운영체제도…?

에이… 아니지… 설마 C 언어로 운영체제는 못만들겠죠…

닉값 ㄷㄷ

윈도우가 c나 c++로 짜여졌다고 합니다…

우와… 그렇구나… 설마 리눅스를 만든 사람이 git 을 만든건 아니겠죠… 에이 설마…

:rofl: