C/C++ 实现简易HTTP服务器
#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服务器的更多相关文章
- Python中使用Flask、MongoDB搭建简易图片服务器
主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...
- [源码]Python简易http服务器(内网渗透大文件传输含下载命令)
Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...
- 【教程】手写简易web服务器
package com.littlepage.testjdbc; import java.io.BufferedReader; import java.io.FileReader; import ja ...
- 阻塞式简易http服务器
说明 使用java.net包的ServerSocket也是阻塞的,所以下面的实例把ServerSocketChannel换成ServerSocket效果一样. 后台代码 package ...
- 理解tomcat之搭建简易http服务器
做过java web的同学都对tomcat非常熟悉.我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http服务器,本篇文章将搭建一个简单的http服 ...
- Socket 简易静态服务器 WPF MVVM模式(四)
最重要的一个类Socket类 using System; using System.Collections.Generic; using System.IO; using System.Linq; u ...
- Socket 简易静态服务器 WPF MVVM模式(三)
ViewModels类 这个类其实就是个大杂烩,什么都可以用 这个类没有什么东西,最多的就是写一下xaml页面的逻辑控制,开启关闭监听 using System; using System.Colle ...
- Socket 简易静态服务器 WPF MVVM模式(二)
command类 标准来说,command会有三种模式,委托命令 准备命令 附加命令 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand ...
- Socket 简易静态服务器 WPF MVVM模式(一)
整体代码下载 主要实现功能: Socket的简单应用 可修改IP和端口 显示来访信息 界面设计: 界面采用MVVM设计,很简陋. 前台的主要目的是 输入IP地址 输入端口 输入文件目录 开启监听和停止 ...
- Python实现简易HTTP服务器
一.Python3 搭建简易HTTP服务器 python -m http.server 浏览器访问:http://localhost:8000 Python3 cgiserver python -m ...
随机推荐
- AtCoder Beginner Contest 162 C~F
比赛链接:Here AB水题, C - Sum of gcd of Tuples (Easy) 题意:\(\sum_{a=1}^{K} \sum_{b=1}^{K} \sum_{c=1}^{K} g ...
- 🚀Flutter应用程序的加固原理
在移动应用开发中,Flutter已经成为一种非常流行的技术选项,可以同时在Android和iOS平台上构建高性能.高质量的移动应用程序.但是,由于其跨平台特性,Flutter应用程序也面临着一些安 ...
- vue-cli3开启gzip压缩
首先添加yarn add 插件 "compression-webpack-plugin" 然后在vue.config.js里引入 在configureWebpack里增加插件代码. ...
- NET Core实战项目之CMS 设计篇 思维导图
NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程 .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程 .NET Core实战项目之CMS 第九章 设计篇 ...
- plsql打开报错:Control 'dxDockBrowserPanel' has no parent window问题解决
一.现象: 使用plsql登陆oracle数据库时,登陆信息没有报错,但是最后一步报错,重启电脑依然没有解决 一直报:" Control 'dxDockBrowserPanel' has n ...
- java项目实践-jsp-filter-监听器-day19
目录 1. jsp 2. 过滤器 3. listener 监听器 1. jsp servle逻辑处理方便 html页面表现麻烦 jsp 页面表现方便 但是逻辑处理麻烦 JSP 是一种页面技术 JSP本 ...
- 基于python的租房网站-房屋出租租赁系统(python+django+vue)
该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品.欢迎大家提出宝贵建议. 功能介绍 平台采用B/S结构,后端采用主流的Python+Django进行 ...
- Julia编程基础
技术背景 Julia目前来说算是一个比较冷门的编程语言,主要是因为它所针对的应用场景实在是比较有限,Julia更注重于科学计算领域的应用.而Julia最大的特点,就是官方所宣传的:拥有C的性能,且可以 ...
- java - 对象装载数据传递到方法中
1. 创建 Phone 类 package class_object; public class Phone { String brand; String color; double price; v ...
- 海思Hi35xx 通过uboot查看flash指定地址的数据
前言 在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样. 网上有介绍说是nandflash 不稳定,高温或是静电会导致nan ...