IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> c++实现最简单的http服务器(windows环境下) -> 正文阅读

[网络协议]c++实现最简单的http服务器(windows环境下)

最近工作忙,没时间研究代码,正好今天在单位值班,研究了下http服务器的实现,之前做后台经常用apache和IIS服务器,这次查了下资料写个简单的http服务器,个人比较喜欢用javascript编写hta应用程序,可是js功能太弱了,实现了http服务器,就可以用特殊端口让javascript和c++交互,js不能做的事情交给c++处理,不多说,先上代码。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, “wsock32.lib”)
#include <iostream>
#define port 8888 //监听端口
using namespace std;
int main()
{
	WSAData wsa;
    if (::WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        cout<<"WSAStartup error"<<endl;
        return 0;
    }
	//创建socket套接字
	SOCKET localFd = socket(AF_INET, SOCK_STREAM, 0);
	if (localFd == INVALID_SOCKET)
	{
		cout << "socket 错误!" << endl;
		exit(-1);
	}

	//sockaddr_in结构体:可以存储一套网络地址(包括IP与端口)
	struct sockaddr_in localAddr;
	localAddr.sin_family = AF_INET;
	localAddr.sin_port = htons(port);  //绑定端口
	localAddr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定本机IP地址

	//将网络地址与套接字绑定
	int res = bind(localFd, (struct sockaddr *)&localAddr, sizeof(localAddr));
	if (res == -1)
	{
		cout << "绑定错误!" << endl;
		exit(-1);
	}

	//监听试图连接本机的客户端,监听的进程数这里设置为20
	listen(localFd, 20);
	cout << "服务运行中...." << endl;

	while (true)//接收客户端的请求
	{
		//创建sockaddr_in结构体,用来存储客户机的地址
		struct sockaddr_in clientAddr;
		int len = sizeof(clientAddr);
		//阻塞运行,直到收到某一客户机的连接请求,并返回客户机的描述符
		int clientFd = accept(localFd, (struct sockaddr *)&clientAddr, &len);
		if (clientFd == -1)
		{
			cout << "accept错误\n"
				 << endl;
			exit(-1);
		}

		//客户端的信息
		char *ip = inet_ntoa(clientAddr.sin_addr);
		cout << "客户端: " << ip << " 连接到本服务器成功!" << endl;

		//输出客户端请求头
		char buff[1024] = {0};
		int size = recv(clientFd, buff, sizeof(buff),0);
		cout << "Request information:\n"
			 << buff << endl;
		cout << size << " bytes" << endl;
		
		//向客户端发送响应头及string
		char* html="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<h1>欢迎使用sdxjwkq01的服务器</h1><hr>";
		send(clientFd, html, strlen(html),0);
		closesocket(clientFd);
	}
}

注释解释的很详细了,这个用了winsock2.h和windows.h头文件,要是linux环境头文件要修改一下,recv()和send()两个方法也要相应的改成read()和write().

这个是运行后的效果,时间不早了,暂且完成这些,等有时间再完善下它的功能,get方法,post方法,delete方法啥的,再加点接口。

?

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:19:05  更:2021-10-17 12:19:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:45:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码