All pastes #174374 Raw Edit

Someone

public text v1 · immutable
·published 2006-09-17 21:14 UTC
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;

	}

}