Created
July 27, 2019 13:41
-
-
Save surinoel/bc818113430f501d3d3e6265b3234eb1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <fcntl.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <pthread.h> | |
#include <sys/stat.h> | |
#include <arpa/inet.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
static void *clnt_connection(void *arg); | |
int sendData(int fd, FILE *fp, char *file_name); | |
void sendOk(FILE *fp); | |
void sendError(FILE *fp); | |
int main(int argc, char **argv) | |
{ | |
int serv_sock; | |
pthread_t tid; | |
struct sockaddr_in serv_addr, clnt_addr; | |
socklen_t clnt_addr_size; | |
if(argc != 2) { | |
printf("usage : %s <PORT>\n", argv[0]); | |
return -1; | |
} | |
serv_sock = socket(AF_INET, SOCK_STREAM, 0); | |
if(serv_sock < 0) { | |
perror("socket"); | |
return -1; | |
} | |
memset(&serv_addr, 0, sizeof(serv_addr)); | |
serv_addr.sin_family = AF_INET; | |
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
serv_addr.sin_port = htons(atoi(argv[1])); | |
if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { | |
perror("bind"); | |
return -1; | |
} | |
if(listen(serv_sock, 10) < 0) { | |
perror("listen"); | |
return -1; | |
} | |
while(1) { | |
int clnt_sock; | |
clnt_addr_size = sizeof(clnt_addr); | |
clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size); | |
printf("Client IP : %s:%d\n", inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port)); | |
pthread_create(&tid, NULL, clnt_connection, (void *)&clnt_sock); | |
pthread_detach(tid); | |
} | |
return 0; | |
} | |
void *clnt_connection(void *arg) | |
{ | |
int clnt_sock = *((int *)arg), clnt_fd; | |
FILE *clnt_read, *clnt_write; | |
char reg_line[BUFSIZ], reg_buf[BUFSIZ]; | |
char method[10]; | |
char file_name[256]; | |
// 파일 디스크립터를 파일 포인터로 설정 | |
clnt_read = fdopen(clnt_sock, "r"); | |
clnt_write = fdopen(dup(clnt_sock), "w"); | |
clnt_fd = clnt_sock; | |
fgets(reg_line, BUFSIZ, clnt_read); | |
fputs(reg_line, stdout); | |
strcpy(method, strtok(reg_line, " /")); | |
if(strcmp(method, "POST") == 0) { | |
sendOk(clnt_write); | |
fclose(clnt_read); | |
fclose(clnt_write); | |
return NULL; | |
} | |
else if(strcmp(method, "GET") != 0) { | |
sendError(clnt_write); | |
fclose(clnt_read); | |
fclose(clnt_write); | |
return NULL; | |
} | |
// index.html을 뽑아낸다 | |
strcpy(file_name, strtok(NULL, " /")); | |
do { | |
// 메세지 헤더가 나올 때까지 내용을 출력한다 | |
fgets(reg_line, BUFSIZ, clnt_read); | |
fputs(reg_line, stdout); | |
strcpy(reg_buf, reg_line); | |
} while(strncmp(reg_line, "\r\n", 2)); | |
sendData(clnt_fd, clnt_write, file_name); | |
fclose(clnt_read); | |
fclose(clnt_write); | |
return NULL; | |
} | |
int sendData(int fd, FILE *fp, char *file_name) | |
{ | |
char protocol[] = "HTTP/1.1 200 OK\r\n"; | |
char server[] = "Server:Netscape-Enterprise\6.0\r\n"; | |
char cnt_type[] = "Content-Type:text/html\r\n"; | |
char end[] = "\r\n"; | |
char buf[BUFSIZ]; | |
int len; | |
// HTTP 헤더 정보를 완성한다 | |
fputs(protocol, fp); | |
fputs(server, fp); | |
fputs(cnt_type, fp); | |
fputs(end, fp); | |
fflush(fp); | |
// index.html을 읽은 후 보낸다 | |
fd = open(file_name, O_RDWR); | |
do { | |
len = read(fd, buf, BUFSIZ); | |
fwrite(buf, len, sizeof(char), fp); | |
} while(len == BUFSIZ); | |
fflush(fp); | |
close(fd); | |
return 0; | |
} | |
void sendOk(FILE *fp) | |
{ | |
char protocol[] = "HTTP/1.1 200 OK\r\n"; | |
char server[] = "Server: Netscape-Enterprise/6.0\r\n\r\n"; | |
fputs(protocol, fp); | |
fputs(server, fp); | |
fflush(fp); | |
} | |
void sendError(FILE *fp) | |
{ | |
char protocol[] = "HTTP/1.1 200 OK\r\n"; | |
char server[] = "Server:Netscape-Enterprise\6.0\r\n"; | |
char cnt_len[] = "Content-Length:1024\r\n"; | |
char cnt_type[] = "Content-Type:text/html\r\n"; | |
char content1[] = "<html><head><title>BAD Connection</title></head>"; | |
char content2[] = "<body><font size=+5>BAD Request</font></body></html>"; | |
printf("send_error\n"); | |
fputs(protocol, fp); | |
fputs(server, fp); | |
fputs(cnt_len, fp); | |
fputs(cnt_type, fp); | |
fputs(content1, fp); | |
fputs(content2, fp); | |
fflush(fp); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment