#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
void sendf(SOCKET *, char *);
void sendrn(SOCKET *);
void error(char *);
int main() {
int code;
WSADATA wsadata;
puts("WSAStartup()");
code = WSAStartup(MAKEWORD(1, 1), &wsadata);
if (code != 0) error("WSAStartup()");
puts("socket()");
SOCKET sServer = socket(AF_INET, SOCK_STREAM, 0);
if (sServer == INVALID_SOCKET) error("socket()");
SOCKADDR_IN aServer;
memset(&aServer, 0, sizeof(aServer));
aServer.sin_family = PF_INET;
aServer.sin_addr.s_addr = htonl(INADDR_ANY);
aServer.sin_port = htons(4321);
puts("bind()");
code = bind(sServer, (SOCKADDR *)&aServer, sizeof(aServer));
if (code == SOCKET_ERROR) error("bind()");
puts("listen()");
code = listen(sServer, 5);
if (code == SOCKET_ERROR) error("bind()");
SOCKADDR_IN aClient;
int aClientSize = sizeof(aClient);
puts("accept()");
SOCKET sClient = accept(sServer, (SOCKADDR *)&aClient, &aClientSize);
if (sClient == INVALID_SOCKET) error("accpet()");
printf("Client connected: %s\n", inet_ntoa(aClient.sin_addr));
char c;
boolean header = false;
while (recv(sClient, &c, 1, 0) > 0) {
printf("%c", c);
if (c == '\r') {
if (recv(sClient, &c, 1, 0) < 0) break;
printf("%c", c);
if (c == '\n') {
if (header) {
header = false;
break;
}
else header = true;
}
else header = false;
}
else header = false;
}
char buffer[8];
for (int i=0; i<sizeof(buffer); i++) printf("%02d ", i);
printf("\tText\n");
for (int i=0; i<sizeof(buffer)*3-1; i++) printf("=");
printf(" \t========\n");
int r;
while ((r=recv(sClient, buffer, sizeof(buffer), 0)) > 0) {
if (r < 0) break;
for (int i=0; i<r; i++) {
printf("%02x ", buffer[i]);
}
if (r < sizeof(buffer)) {
for (int i=0; i<(sizeof(buffer)-r); i++) printf(" ");
}
printf("\t");
for (int i=0; i<r; i++) {
switch (buffer[i]) {
case 0: case 10: case 13:
buffer[i] = '.';
break;
}
printf("%c", buffer[i]);
}
printf("\n");
if (r < sizeof(buffer)) break;
}
printf("\n");
puts("Send response to Client.");
sendf(&sClient, "HTTP/1.1 200 OK");
sendf(&sClient, "Content-Type: text/html; Charset: UTF-8");
sendrn(&sClient);
sendf(&sClient, "<!DOCTYPE html>");
sendf(&sClient, "<html>");
sendf(&sClient, "<head>");
sendf(&sClient, "<style>");
sendf(&sClient, "body {");
sendf(&sClient, "margin: 0px;");
sendf(&sClient, "padding: 0px;");
sendf(&sClient, "font-family: Dotum;");
sendf(&sClient, "font-size: 12px;");
sendf(&sClient, "}");
sendf(&sClient, "#test_div {");
sendf(&sClient, "margin: 10px;");
sendf(&sClient, "width: 100px;");
sendf(&sClient, "height: 100px;");
sendf(&sClient, "background: #700;");
sendf(&sClient, "border: 3px solid #000;");
sendf(&sClient, "border-radius: 3px;");
sendf(&sClient, "}");
sendf(&sClient, "</style>");
sendf(&sClient, "<title>title</title>");
sendf(&sClient, "</head>");
sendf(&sClient, "<body>");
sendf(&sClient, "Hello");
sendf(&sClient, "<div id='test_div'></div>");
sendf(&sClient, "</body>");
sendf(&sClient, "</html>");
closesocket(sClient);
closesocket(sServer);
WSACleanup();
exit(0);
}
void sendf(SOCKET *socket, char *s) {
send(*socket, s, strlen(s), 0);
sendrn(socket);
}
void sendrn(SOCKET *socket) {
send(*socket, "\r\n", 2, 0);
}
void error(char *s) {
fprintf(stderr, "Error: \n", s);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8V2luU29jazIuaD4KCnZvaWQgc2VuZGYoU09DS0VUICosIGNoYXIgKik7CnZvaWQgc2VuZHJuKFNPQ0tFVCAqKTsKdm9pZCBlcnJvcihjaGFyICopOwoKaW50IG1haW4oKSB7CiAgICBpbnQgY29kZTsKCglXU0FEQVRBIHdzYWRhdGE7CglwdXRzKCJXU0FTdGFydHVwKCkiKTsKCWNvZGUgPSBXU0FTdGFydHVwKE1BS0VXT1JEKDEsIDEpLCAmd3NhZGF0YSk7CglpZiAoY29kZSAhPSAwKSBlcnJvcigiV1NBU3RhcnR1cCgpIik7CgoJcHV0cygic29ja2V0KCkiKTsKCVNPQ0tFVCBzU2VydmVyID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKCWlmIChzU2VydmVyID09IElOVkFMSURfU09DS0VUKSBlcnJvcigic29ja2V0KCkiKTsKCglTT0NLQUREUl9JTiBhU2VydmVyOwoJbWVtc2V0KCZhU2VydmVyLCAwLCBzaXplb2YoYVNlcnZlcikpOwoJYVNlcnZlci5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKCWFTZXJ2ZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CglhU2VydmVyLnNpbl9wb3J0ID0gaHRvbnMoNDMyMSk7CgoJcHV0cygiYmluZCgpIik7Cgljb2RlID0gYmluZChzU2VydmVyLCAoU09DS0FERFIgKikmYVNlcnZlciwgc2l6ZW9mKGFTZXJ2ZXIpKTsKCWlmIChjb2RlID09IFNPQ0tFVF9FUlJPUikgZXJyb3IoImJpbmQoKSIpOwoKCXB1dHMoImxpc3RlbigpIik7Cgljb2RlID0gbGlzdGVuKHNTZXJ2ZXIsIDUpOwoJaWYgKGNvZGUgPT0gU09DS0VUX0VSUk9SKSBlcnJvcigiYmluZCgpIik7CgoJU09DS0FERFJfSU4gYUNsaWVudDsKCWludCBhQ2xpZW50U2l6ZSA9IHNpemVvZihhQ2xpZW50KTsKCXB1dHMoImFjY2VwdCgpIik7CglTT0NLRVQgc0NsaWVudCA9IGFjY2VwdChzU2VydmVyLCAoU09DS0FERFIgKikmYUNsaWVudCwgJmFDbGllbnRTaXplKTsKCWlmIChzQ2xpZW50ID09IElOVkFMSURfU09DS0VUKSBlcnJvcigiYWNjcGV0KCkiKTsKCglwcmludGYoIkNsaWVudCBjb25uZWN0ZWQ6ICVzXG4iLCBpbmV0X250b2EoYUNsaWVudC5zaW5fYWRkcikpOwoKCWNoYXIgYzsKCWJvb2xlYW4gaGVhZGVyID0gZmFsc2U7Cgl3aGlsZSAocmVjdihzQ2xpZW50LCAmYywgMSwgMCkgPiAwKSB7CgkJcHJpbnRmKCIlYyIsIGMpOwoJCWlmIChjID09ICdccicpIHsKCQkJaWYgKHJlY3Yoc0NsaWVudCwgJmMsIDEsIDApIDwgMCkgYnJlYWs7CgkJCXByaW50ZigiJWMiLCBjKTsKCQkJaWYgKGMgPT0gJ1xuJykgewoJCQkJaWYgKGhlYWRlcikgewoJCQkJCWhlYWRlciA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJZWxzZSBoZWFkZXIgPSB0cnVlOwoJCQl9CgkJCWVsc2UgaGVhZGVyID0gZmFsc2U7CgkJfQoJCWVsc2UgaGVhZGVyID0gZmFsc2U7Cgl9CgoJY2hhciBidWZmZXJbOF07Cglmb3IgKGludCBpPTA7IGk8c2l6ZW9mKGJ1ZmZlcik7IGkrKykgcHJpbnRmKCIlMDJkICIsIGkpOwoJcHJpbnRmKCJcdFRleHRcbiIpOwoJZm9yIChpbnQgaT0wOyBpPHNpemVvZihidWZmZXIpKjMtMTsgaSsrKSBwcmludGYoIj0iKTsKCXByaW50ZigiIFx0PT09PT09PT1cbiIpOwoKCWludCByOwoJd2hpbGUgKChyPXJlY3Yoc0NsaWVudCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCkpID4gMCkgewoJCWlmIChyIDwgMCkgYnJlYWs7CgkJZm9yIChpbnQgaT0wOyBpPHI7IGkrKykgewoJCQlwcmludGYoIiUwMnggIiwgYnVmZmVyW2ldKTsKCQl9CgkJaWYgKHIgPCBzaXplb2YoYnVmZmVyKSkgewoJCQlmb3IgKGludCBpPTA7IGk8KHNpemVvZihidWZmZXIpLXIpOyBpKyspIHByaW50ZigiICAgIik7CgkJfQoJCXByaW50ZigiXHQiKTsKCQlmb3IgKGludCBpPTA7IGk8cjsgaSsrKSB7CgkJCXN3aXRjaCAoYnVmZmVyW2ldKSB7CgkJCQljYXNlIDA6IGNhc2UgMTA6IGNhc2UgMTM6CgkJCQkJYnVmZmVyW2ldID0gJy4nOwoJCQkJCWJyZWFrOwoJCQl9CgkJCXByaW50ZigiJWMiLCBidWZmZXJbaV0pOwoJCX0KCQlwcmludGYoIlxuIik7CgkJaWYgKHIgPCBzaXplb2YoYnVmZmVyKSkgYnJlYWs7Cgl9CglwcmludGYoIlxuIik7CgoJcHV0cygiU2VuZCByZXNwb25zZSB0byBDbGllbnQuIik7CglzZW5kZigmc0NsaWVudCwgIkhUVFAvMS4xIDIwMCBPSyIpOwoJc2VuZGYoJnNDbGllbnQsICJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgQ2hhcnNldDogVVRGLTgiKTsKCXNlbmRybigmc0NsaWVudCk7CglzZW5kZigmc0NsaWVudCwgIjwhRE9DVFlQRSBodG1sPiIpOwoJc2VuZGYoJnNDbGllbnQsICI8aHRtbD4iKTsKCXNlbmRmKCZzQ2xpZW50LCAiPGhlYWQ+Iik7CglzZW5kZigmc0NsaWVudCwgIjxzdHlsZT4iKTsKCXNlbmRmKCZzQ2xpZW50LCAiYm9keSB7Iik7CglzZW5kZigmc0NsaWVudCwgIm1hcmdpbjogMHB4OyIpOwoJc2VuZGYoJnNDbGllbnQsICJwYWRkaW5nOiAwcHg7Iik7CglzZW5kZigmc0NsaWVudCwgImZvbnQtZmFtaWx5OiBEb3R1bTsiKTsKCXNlbmRmKCZzQ2xpZW50LCAiZm9udC1zaXplOiAxMnB4OyIpOwoJc2VuZGYoJnNDbGllbnQsICJ9Iik7CglzZW5kZigmc0NsaWVudCwgIiN0ZXN0X2RpdiB7Iik7CglzZW5kZigmc0NsaWVudCwgIm1hcmdpbjogMTBweDsiKTsKCXNlbmRmKCZzQ2xpZW50LCAid2lkdGg6IDEwMHB4OyIpOwoJc2VuZGYoJnNDbGllbnQsICJoZWlnaHQ6IDEwMHB4OyIpOwoJc2VuZGYoJnNDbGllbnQsICJiYWNrZ3JvdW5kOiAjNzAwOyIpOwoJc2VuZGYoJnNDbGllbnQsICJib3JkZXI6IDNweCBzb2xpZCAjMDAwOyIpOwoJc2VuZGYoJnNDbGllbnQsICJib3JkZXItcmFkaXVzOiAzcHg7Iik7CglzZW5kZigmc0NsaWVudCwgIn0iKTsKCXNlbmRmKCZzQ2xpZW50LCAiPC9zdHlsZT4iKTsKCXNlbmRmKCZzQ2xpZW50LCAiPHRpdGxlPnRpdGxlPC90aXRsZT4iKTsKCXNlbmRmKCZzQ2xpZW50LCAiPC9oZWFkPiIpOwoJc2VuZGYoJnNDbGllbnQsICI8Ym9keT4iKTsKCXNlbmRmKCZzQ2xpZW50LCAiSGVsbG8iKTsKCXNlbmRmKCZzQ2xpZW50LCAiPGRpdiBpZD0ndGVzdF9kaXYnPjwvZGl2PiIpOwoJc2VuZGYoJnNDbGllbnQsICI8L2JvZHk+Iik7CglzZW5kZigmc0NsaWVudCwgIjwvaHRtbD4iKTsKCgljbG9zZXNvY2tldChzQ2xpZW50KTsKCgljbG9zZXNvY2tldChzU2VydmVyKTsKCglXU0FDbGVhbnVwKCk7CgoJZXhpdCgwKTsKfQoKdm9pZCBzZW5kZihTT0NLRVQgKnNvY2tldCwgY2hhciAqcykgewoJc2VuZCgqc29ja2V0LCBzLCBzdHJsZW4ocyksIDApOwoJc2VuZHJuKHNvY2tldCk7Cn0Kdm9pZCBzZW5kcm4oU09DS0VUICpzb2NrZXQpIHsKCXNlbmQoKnNvY2tldCwgIlxyXG4iLCAyLCAwKTsKfQp2b2lkIGVycm9yKGNoYXIgKnMpIHsKCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFxuIiwgcyk7Cn0=