C/C++ 实现简易HTTP服务器的示例

 更新时间:2020年10月19日 09:57:44   作者:lyshark  
这篇文章主要介绍了C/C++ 实现简易HTTP服务器的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 2048
#define BUF_SMALL 100

void Send_404(SOCKET sock)
{
	char Protocol[] = "HTTP/1.0 404 Bad Request\r\n";
	send(sock, Protocol, strlen(Protocol),0);
	closesocket(sock);
}

void SendData(SOCKET sock, char *filename)
{
	char Protocol[] = "HTTP/1.1 200 OK\r\n";
	char ServerType[] = "Server:MyWebServer\r\n";
	char ContentLen[] = "Content-length:2048\r\n";
	char ContentType[] = "Content-type:text/html\r\n";
	char buffer[BUF_SIZE] = {0};
	FILE *fp;
	if ((fp = fopen(filename, "r")) != NULL)
	{
		// 传输头数据
		send(sock, Protocol, strlen(Protocol), 0);
		send(sock, ServerType, strlen(ServerType), 0);
		send(sock, ContentLen, strlen(ContentLen), 0);
		send(sock, ContentType, strlen(ContentType), 0);

		// 传输数据
		while (fgets(buffer, BUF_SIZE, fp) != NULL)
			send(sock, buffer, strlen(buffer), 0);
		closesocket(sock);
	}
}

unsigned WINAPI RequestHandle(void *argv)
{
	SOCKET hClntSock = (SOCKET)argv;

	char Buffer[BUF_SIZE] = { 0 };
	char Method[BUF_SMALL] = { 0 };
	char FileName[BUF_SMALL] = { 0 };

	recv(hClntSock, Buffer, BUF_SIZE, 0);

	// 寻找HTTP请求头 如果不为空则继续
	if (strstr(Buffer, "HTTP/1") != NULL)
	{
		// 接着判断是否为GET请求方式
		strcpy(Method, strtok(Buffer, "/"));
		if (strcmp(Method, "GET") != 0)
		{
			strcpy(FileName, strtok(0, "/"));
			printf("请求方式: %s 请求文件: %s \n", Method,FileName);
			SendData(hClntSock, FileName);
			closesocket(hClntSock);
			return 0;
		}
	}

	Send_404(hClntSock);
	closesocket(hClntSock);
	return -1;
}

int main(int argc,char * argv[])
{
	WSADATA wsaData;
	SOCKET ServerSock, ClientSock;
	SOCKADDR_IN ServerAddr, ClientAddr;

	WSAStartup(MAKEWORD(2, 2), &wsaData);
	ServerSock = socket(PF_INET, SOCK_STREAM, 0);
	memset(&ServerAddr, 0, sizeof(ServerAddr));

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	ServerAddr.sin_port = htons(80);

	bind(ServerSock, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
	listen(ServerSock, 10);

	while (1)
	{
		HANDLE hThread;
		DWORD dwThreadID;
		int ClientAddrSize;

		ClientAddrSize = sizeof(ClientAddr);
		ClientSock = accept(ServerSock, (SOCKADDR *)&ClientAddr, &ClientAddrSize);

		printf("请求客户端 IP: %s --> 端口: %d \n", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));
		hThread = (HANDLE)_beginthreadex(0, 0, RequestHandle, (void *)ClientSock, 0, (unsigned *)&dwThreadID);
	}
	closesocket(ServerSock);
	WSACleanup();
	return 0;
}

以上就是C/C++ 实现简易HTTP服务器的示例的详细内容,更多关于C/C++ 实现简易HTTP服务器的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Qt+OpenCV实现图像灰度化像素

    基于Qt+OpenCV实现图像灰度化像素

    在图像处理领域,OpenCV是一款强大而广泛应用的开源库,能够提供丰富的图像处理和计算机视觉功能,本文将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理,实现更加独特和吸引人的效果
    2023-11-11
  • c++数组排序的5种方法实例代码

    c++数组排序的5种方法实例代码

    大家还在为大小排序而烦恼吗?今天让我我大家解决这个问题吧,下面这篇文章主要给大家介绍了关于c++数组排序的5种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Windows安装Qt6.4.2及简单验证

    Windows安装Qt6.4.2及简单验证

    本文主要介绍了Windows安装Qt6.4.2及简单验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C++类与对象之日期类的实现

    C++类与对象之日期类的实现

    这篇文章主要介绍如何实现C++中的日期类相关资料,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • C++ 中引用和指针的关系实例详解

    C++ 中引用和指针的关系实例详解

    这篇文章主要介绍了C++ 中引用和指针的关系实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++实现获取邮件中的附件

    C++实现获取邮件中的附件

    这篇文章主要为大家详细介绍了如何通过C++实现获取邮件文件中的附件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C++实现信息管理系统

    C++实现信息管理系统

    这篇文章主要为大家详细介绍了C++实现信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • VC小技巧汇总之5则实用小技巧

    VC小技巧汇总之5则实用小技巧

    这篇文章主要介绍了VC小技巧汇总之5则实用小技巧,需要的朋友可以参考下
    2014-07-07
  • CrashRpt使用案例详解

    CrashRpt使用案例详解

    这篇文章主要介绍了CrashRpt使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++实现LeetCode(78.子集合)

    C++实现LeetCode(78.子集合)

    这篇文章主要介绍了C++实现LeetCode(78.子集合),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论