服务端:
#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;
}