rendered paste body#pragma comment(lib, "ws2_32")
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#define H_MAX 1500
typedef struct ClientPack{
char *szIP;
SOCKET sSocket;
}CLIENTPACK, *PCLIENTPACK;
DWORD WINAPI Handler(LPVOID lpParam);
void HandleError(int nErrorCode);
char *GetEntireFile(LPSTR path);
int main(int argc, char **argv)
{
int nPort = 0;
printf("Enter listen port: ");
scanf("%i", &nPort);
MessageBeep(MB_ICONERROR);
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 0), &wsaData) != 0){
WSACleanup();
printf("\n\n[1] Failed to Initialize winsock!\n\n");
getchar();
return -1;
}
printf("\n\n[1] Initiated Winsock...\n\n");
SOCKET sListen = NULL;
if((sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
WSACleanup();
printf("[2] Failed to create socket!\n\n");
getchar();
return -1;
}
SOCKADDR_IN SockInfo;
SockInfo.sin_addr.s_addr = INADDR_ANY;
SockInfo.sin_family = AF_INET;
SockInfo.sin_port = htons(nPort);
if(bind(sListen, (SOCKADDR*)&SockInfo, sizeof(SockInfo)) == SOCKET_ERROR){
printf("[3] Failed to bind socket!\n\n");
closesocket(sListen);
WSACleanup();
getchar();
return -1;
}
printf("[3] Socket bound!\n\n");
if(listen(sListen, SOMAXCONN) == SOCKET_ERROR){
printf("[4] Failed to listen on given port!\n\n");
closesocket(sListen);
WSACleanup();
getchar();
return -1;
}
printf("[4] Now listening on port %d!\n\n", nPort);
SOCKET sClient;
sockaddr_in RemoteInfo;
while(TRUE){
Sleep(1);
int nRemoteInfoSize = sizeof(RemoteInfo);
sClient = accept(sListen, (sockaddr*)&RemoteInfo, &nRemoteInfoSize);
if(sClient != INVALID_SOCKET){
printf("New Connection: %s\n", inet_ntoa(RemoteInfo.sin_addr));
CLIENTPACK ClientPack;
ClientPack.sSocket = sClient;
ClientPack.szIP = inet_ntoa(RemoteInfo.sin_addr);
CreateThread(0, NULL, (LPTHREAD_START_ROUTINE)&Handler, (void*)&ClientPack, NULL, NULL);
}
}
return 0;
}
DWORD WINAPI Handler(LPVOID lpParam)
{
PCLIENTPACK ClientPack = (PCLIENTPACK)lpParam;
char szRcvBuff[H_MAX];
int nRecvCount = recv(ClientPack->sSocket, szRcvBuff, sizeof(szRcvBuff), 0);
if(nRecvCount == SOCKET_ERROR){
int nError = WSAGetLastError();
HandleError(nError);
}
HANDLE hFile = CreateFile("C:\\miniWWW\\index.html", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD fdwSize = GetFileSize(hFile, NULL);
DWORD fdwRead = 0;
char *szFile = (char*)malloc(fdwSize + 1);
ReadFile(hFile, szFile, fdwSize, &fdwRead, NULL);
char szHeader[1024];
sprintf((char*)&szHeader, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n", fdwSize);
strcat(szHeader, szFile);
int nSend = send(ClientPack->sSocket, szHeader, strlen(szHeader), 0);
if(nSend == SOCKET_ERROR) HandleError(WSAGetLastError());
closesocket(ClientPack->sSocket);
free(szFile);
CloseHandle(hFile);
return 0 ;
}
void HandleError(int nErrorCode)
{
switch(nErrorCode)
{
case 10054:
printf(" [e] Connection reset by peer!\n");
break;
case 10038:
printf(" [e] Operation attempted on invalid socket!\n");
break;
case 10060:
printf(" [e] Connection timed out!\n");
break;
case 10061:
printf(" [e] Connection refused!\n");
break;
default:
printf(" [e] Unknown error: %d", nErrorCode);
break;
}
}