#include <iostream>
#include <WinSock2.h>
#include <ctime>
#include <process.h>
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 2048
#define BUF_SMALL 100
unsigned WINAPI RequestHandler(void* arg);
char* ContentType(char* file);
void SendData(SOCKET sock, char* ct, char* fileName);
void SendErrorMSG(SOCKET sock);
void Error(char* m);
int main(int argc, char **argv)
{
WSADATA wsadata;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAdr, clntAdr;
HANDLE hThread;
DWORD dwThreadID;
int clntAdrSize;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
Error("WSAStartup() error");
hServSock = socket(PF_INET, SOCK_STREAM, 0);
memset(&servAdr, 0, sizeof(servAdr));
servAdr.sin_family = AF_INET;
servAdr.sin_addr.s_addr = htonl(INADDR_ANY);
servAdr.sin_port = htons(9876);
if (bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR)
Error("bind() error");
if (listen(hServSock, 0) == INVALID_SOCKET)
Error("listen() error");
while (1)
{
clntAdrSize = sizeof(clntAdr);
hClntSock = accept(hServSock, (SOCKADDR*)&clntAdr, &clntAdrSize);
printf("Connection Request : %s:%d\n", inet_ntoa(clntAdr.sin_addr), ntohs(clntAdr.sin_port));
hThread = (HANDLE)_beginthreadex(NULL, 0, RequestHandler, (void*)hClntSock, 0, (unsigned*)&dwThreadID);
}
closesocket(hServSock);
WSACleanup();
return 0;
}
unsigned WINAPI RequestHandler(void* arg)
{
SOCKET hClntSock = (SOCKET)arg;
char buf[BUF_SIZE];
char method[BUF_SMALL];
char ct[BUF_SMALL];
char fileName[BUF_SMALL];
recv(hClntSock, buf, BUF_SIZE, 0);
printf("recive data: %s\n", buf);
if (strstr(buf, "HTTP/") == NULL)
{
SendErrorMSG(hClntSock);
closesocket(hClntSock);
return 1;
}
strcpy(method, strtok(buf, " /"));
if (strcmp(method, "GET"))
SendErrorMSG(hClntSock);
strcpy(fileName, strtok(NULL, " /"));
strcpy(ct, ContentType(fileName));
SendData(hClntSock, ct, fileName);
return 0;
}
void SendData(SOCKET sock, char* ct, char* fileName)
{
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
char servTime[60] = { 0, };
sprintf(servTime, "Date: %sGMT\r\n", asctime(timeinfo));
for (int i = 58; i >= 9; i--)
servTime[i+1] = servTime[i];
servTime[9] = ',';
servTime[31] = 32;
printf("%s \n", servTime);
//strcat(servTime, asctime(timeinfo));
char protocol[] = "HTTP/1.0 200 OK\r\n";
char servName[] = "Server:simple web server\r\n";
char cntLen[] = "Content-length:2048\r\n";
char connection[] = "Connection: Keep-Alive\r\n";
char cntType[BUF_SMALL];
char buf[BUF_SIZE];
FILE* sendFile;
sprintf(cntType, "Content-type:%s\r\n\r\n", ct);
if ((sendFile = fopen(fileName, "r")) == NULL)
{
printf("file open failed\n");
SendErrorMSG(sock);
return;
}
send(sock, protocol, strlen(protocol), 0);
send(sock, servName, strlen(servName), 0);
send(sock, connection, strlen(connection), 0);
send(sock, cntLen, strlen(cntLen), 0);
send(sock, cntType, strlen(cntType), 0);
send(sock, servTime, strlen(servTime), 0);
while (fgets(buf, BUF_SIZE, sendFile) != NULL)
send(sock, buf, strlen(buf), 0);
closesocket(sock);
}
void SendErrorMSG(SOCKET sock)
{
char protocol[] = "HTTP/1.0 400 Bad Request\r\n";
char servName[] = "Server:simple web server\r\n";
char cntLen[] = "Content-length:2048\r\n";
char cntType[] = "Content-type:text/html\r\n\r\n";
char content[] = "<html><head><title>NETWORK</title></head>"
"<body><font size=+5><br>오류 발생! 요청 파일명 및 요청 방식 확인!"
"</font></body></html>";
send(sock, protocol, strlen(protocol), 0);
send(sock, servName, strlen(servName), 0);
send(sock, cntLen, strlen(cntLen), 0);
send(sock, cntType, strlen(cntType), 0);
send(sock, content, strlen(content), 0);
closesocket(sock);
}
char* ContentType(char* file)
{
char extension[BUF_SMALL];
char fileName[BUF_SMALL];
strcpy(fileName, file);
strtok(fileName, ".");
strcpy(extension, strtok(NULL, "."));
if (!strcmp(extension, "html") || !strcmp(extension, "htm"))
return "text/html; charset=EUC-KR";
else
return "text/plain";
}
void Error(char* m)
{
fputs(m, stderr);
fputc('\n', stderr);
exit(1);
}