简易HTTP服务器完成通信

服务端:

#include <iostream>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>

char* GetPath(char* Buffer)
{
	if (!strncmp(Buffer, "GET ", 4))
	{
		int index = 0;
		for (size_t i = 4; i < strlen(Buffer); i++)
		{
			if (Buffer[i] == 0x20)
			{
				index = i;
				break;
			}
		}
		char* pBuffer = new char[index - 4 + 1]{ 0 };
		memcpy(pBuffer, Buffer + 4, index - 4);
		return pBuffer;
	}
}

char* HttpReadFile(const char* pathbuffer)
{
	OFSTRUCT lpReOpenBuff;
	HFILE of = OpenFile(pathbuffer, &lpReOpenBuff, OF_READ);
	DWORD filesize = GetFileSize((HANDLE)of, 0);
	CHAR* filebuffer = new CHAR[filesize]{ 0 };
	DWORD lpNumberOfBytesRead;
	ReadFile((HANDLE)of, filebuffer, filesize, &lpNumberOfBytesRead, 0);
	return filebuffer;
}


int main()
{
	WSADATA lpWSAData;
	WSAStartup(MAKEWORD(2, 2), &lpWSAData);

	SOCKET SerSock = socket(AF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN saddr{ 0 };
	saddr.sin_addr.S_un.S_addr = inet_addr("192.168.222.128");
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(80);

	bind(SerSock, (PSOCKADDR)&saddr, sizeof(saddr));

	listen(SerSock, SOMAXCONN);
	printf("服务器启动成功\n");

	while (true)
	{
		SOCKADDR_IN Clientsaddr{ 0 };
		int size = sizeof(Clientsaddr);
		SOCKET NewSock = accept(SerSock, (PSOCKADDR)&Clientsaddr, &size);
		printf("ip:%s  端口:%d\n", inet_ntoa(Clientsaddr.sin_addr), ntohs(Clientsaddr.sin_port));

		CHAR Buffer[1000]{ 0 };
		int recvsize = recv(NewSock, Buffer, sizeof(Buffer), 0);
		printf("%s", Buffer);
		printf("%dbyte\n\n", recvsize);

		char* PathBuffer = GetPath(Buffer);
		char BasePath[] = "C:\\Users\\Administrator\\Desktop\\www";
		char* filebuffer = nullptr;
		if (strcmp(PathBuffer, "/") == 0)
		{
			filebuffer = HttpReadFile("C:\\Users\\Administrator\\Desktop\\www\\1.html");
		}
		else
		{
			if (strstr(PathBuffer, "html") == 0)
			{
				continue;
			}
			for (size_t i = 0; i < strlen(PathBuffer); i++)
			{
				if (PathBuffer[i] == '/')
				{
					PathBuffer[i] = '\\';
				}
				//拼接完整路径
				char* szHtmlPath = new char[(strlen(PathBuffer) + strlen(BasePath) + 1)]{ 0 };
				sprintf(szHtmlPath, "%s%s", BasePath, PathBuffer);
				filebuffer = HttpReadFile(szHtmlPath);
			}
		}
		char* httpHeader = (char*)"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8";//不要头,也可以显示
		size = strlen(httpHeader) + strlen(filebuffer) ;
		char* sendbuffer = new char[size] { 0 };
		sprintf(sendbuffer, "%s\r\n\r\n%s", httpHeader, filebuffer);

		send(NewSock, sendbuffer, size, 0);
		closesocket(NewSock);
	}

	closesocket(SerSock);
	WSACleanup();
	system("pause");
	return 0;
}

客服端:

#include <iostream>
#include <tchar.h>
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet.lib")

int main()
{
	HINTERNET io = InternetOpen("Goose", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);

	TCHAR szBuffer[] = "http://192.168.222.128";
	HINTERNET iourl = InternetOpenUrl(io, szBuffer, 0, 0, INTERNET_FLAG_NO_CACHE_WRITE, 0);

	DWORD dwNumberOfBytesWritten;
	TCHAR szSendBuffer[] = _T("GET / HTTP/1.1\r\nHost:192.168.222.128\r\n");
	InternetWriteFile(iourl,szSendBuffer,sizeof(szSendBuffer),&dwNumberOfBytesWritten);

	DWORD dwNumberOfBytesRead;
	TCHAR ReceBuffer[2000]{ 0 };
	InternetReadFile(iourl, ReceBuffer, 2000, &dwNumberOfBytesRead);

	printf(_T("%s\n"), ReceBuffer);

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值