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); if(strstr(buf, "HTTP/")==NULL) // HTTP에 의한 요청인지 확인 { SendErrorMSG(hClntSock); closesocket(hClntSock); return 1; } strcpy(method, strtok(buf, " /")); if(strcmp(method, "GET")) // GET 방식 요청인지 확인 SendErrorMSG(hClntSock); strcpy(fileName, strtok(NULL, " /")); // 요청 파일이름 확인 strcpy(ct, ContentType(fileName)); // Content-type 확인 SendData(hClntSock, ct, fileName); // 응 답 return 0; }
void SendData(SOCKET sock, char* ct, char* fileName) { 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 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) { SendErrorMSG(sock); return; } /* 헤더 정보 전송 */ send(sock, protocol, strlen(protocol), 0); send(sock, servName, strlen(servName), 0); send(sock, cntLen, strlen(cntLen), 0); send(sock, cntType, strlen(cntType), 0); /* 요청 데이터 전송 */ while(fgets(buf, BUF_SIZE, sendFile)!=NULL) send(sock, buf, strlen(buf), 0); closesocket(sock); // HTTP 프로토콜에 의해서 응답 후 종료 }
unsigned WINAPI RequestHandler(void* arg) { SOCKET hClntSock = (SOCKET)arg; char buf[BUF_SIZE] = { 0, }; char method[BUF_SMALL] = { 0, }; char ct[BUF_SMALL] = { 0, }; char fileName[BUF_SMALL] = { 0, }; if (recv(hClntSock, buf, BUF_SIZE, 0) == SOCKET_ERROR) ErrorHandling("[DEBUG]recv() Error"); if (strstr(buf, "HTTP/") == NULL) { SendErrorMSG(hClntSock, ERROR_400_BAD_REQUEST); closesocket(hClntSock); return 1; } strcpy(method, strtok(buf, " ")); if (strcmp(method, "GET")) SendErrorMSG(hClntSock, ERROR_400_BAD_REQUEST); strcpy(fileName, strtok(NULL, " ")); memmove(fileName + 1, fileName, strlen(fileName)); fileName[0] = '.'; for (unsigned int i = 0; i < strlen(fileName) + 1; ++i) { if (fileName[i] == '/') fileName[i] = '\\'; } char* type = ContentType(fileName); if (type == NULL) { SendErrorMSG(hClntSock, ERROR_404_NOT_FOUND); closesocket(hClntSock); return 0; } strcpy(ct, ContentType(fileName)); SendData(hClntSock, ct, fileName); return 0; }
void SendData(SOCKET socket, char* ct, char* fileName) { char protocol[] = "HTTP/1.0 200 OK\r\n"; char servName[] = "Server:simple web server\r\n"; char cntLen[BUF_SMALL]; char cntType[BUF_SMALL] = { 0, }; char buf[BUF_SIZE] = { 0, }; FILE* sendFile; sprintf_s(cntType, "Content-type:%s\r\n\r\n", ct); if ((sendFile = fopen(fileName, "rb")) == NULL) { SendErrorMSG(socket, ERROR_404_NOT_FOUND); return; } int fileSize; fseek(sendFile, 0, SEEK_END); fileSize = ftell(sendFile); fseek(sendFile, 0, SEEK_SET); sprintf_s(cntLen, "Content-length : %d\r\n", fileSize); if (send(socket, protocol, strlen(protocol), 0) == SOCKET_ERROR) ErrorHandling("[DEBUG] send() : protocol Error"); if (send(socket, servName, strlen(servName), 0) == SOCKET_ERROR) ErrorHandling("[DEBUG] send() : servName Error"); if (send(socket, cntType, strlen(cntType), 0) == SOCKET_ERROR) ErrorHandling("[DEBUG] send() : cntType Error"); while (!feof(sendFile)) { int read = fread(buf, 1, BUF_SIZE, sendFile); send(socket, buf, read, 0); } closesocket(socket); fclose(sendFile); }