#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服务器的更多相关文章

  1. Python中使用Flask、MongoDB搭建简易图片服务器

    主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...

  2. [源码]Python简易http服务器(内网渗透大文件传输含下载命令)

    Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...

  3. 【教程】手写简易web服务器

    package com.littlepage.testjdbc; import java.io.BufferedReader; import java.io.FileReader; import ja ...

  4. 阻塞式简易http服务器

    说明         使用java.net包的ServerSocket也是阻塞的,所以下面的实例把ServerSocketChannel换成ServerSocket效果一样. 后台代码 package ...

  5. 理解tomcat之搭建简易http服务器

    做过java web的同学都对tomcat非常熟悉.我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http服务器,本篇文章将搭建一个简单的http服 ...

  6. Socket 简易静态服务器 WPF MVVM模式(四)

    最重要的一个类Socket类 using System; using System.Collections.Generic; using System.IO; using System.Linq; u ...

  7. Socket 简易静态服务器 WPF MVVM模式(三)

    ViewModels类 这个类其实就是个大杂烩,什么都可以用 这个类没有什么东西,最多的就是写一下xaml页面的逻辑控制,开启关闭监听 using System; using System.Colle ...

  8. Socket 简易静态服务器 WPF MVVM模式(二)

    command类 标准来说,command会有三种模式,委托命令 准备命令 附加命令 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand ...

  9. Socket 简易静态服务器 WPF MVVM模式(一)

    整体代码下载 主要实现功能: Socket的简单应用 可修改IP和端口 显示来访信息 界面设计: 界面采用MVVM设计,很简陋. 前台的主要目的是 输入IP地址 输入端口 输入文件目录 开启监听和停止 ...

  10. Python实现简易HTTP服务器

    一.Python3 搭建简易HTTP服务器 python -m http.server 浏览器访问:http://localhost:8000 Python3 cgiserver python -m  ...

随机推荐

  1. AIsing Programming Contest 2020 游记 (ABC水题,D思维)

    补题链接:Here A - Number of Multiples 水题 B - An Odd Problem 水题 C - XYZ Triplets 水题,注意数组不要开小了 D - Anythin ...

  2. 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用

    这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...

  3. 企业如何利用 Serverless 快速扩展业务系统?

    2022 年 9 月 24 日,阿里云用户组(AUG)第 12 期活动在厦门举办.活动现场,阿里云高级技术专家史明伟(花名:世如)向参会企业代表分享了<未来已来--从技术升级到降本提效>. ...

  4. vue-awesome-swiper swiper/dist/css/swiper.css 报not found错误

    解决办法删除package-lock.json文件写死package.json版本号  "vue-awesome-swiper": "^3.1.3", 删除no ...

  5. uni-app图片上传接口联调

    https://www.bilibili.com/video/BV1jy4y1B7pw?p=159&spm_id_from=pageDriver

  6. P2058

    这道不难的题引发了我不少思考 我第一个版本是用vector嵌套vector写成的,后来发现没必要还存储那些已经超过24h的船,完全可以删除前面的船,因此把外层vector换成了deque. 即用deq ...

  7. Windows Terminal 配色方案

    { "background": "#FFF2E2", "black": "#000000", "blue&qu ...

  8. linux 通过docker安装 elasticsearch-head

    本文为博主原创,未经允许不得转载: 1. 使用docker安装 elasticsearch-head #拉取镜像 docker pull mobz/elasticsearch-head:5 #创建容器 ...

  9. 【CubeMX】使用 CubeMX 生成对应的配置代码需要设置 “User Label”

    如要生成 SPI 的管脚配置代码,需要设置 User Label,这样工具才能知道应该配置什么,否则不会生成

  10. 选择DOM中除一个元素以外的所有元素[Jquery]

    $(function(){ $('body > *').not('#myDiv') .on('mouseover', function(){ //... }) .on('click', func ...