C++socket编程(七):7.4 正则表达式分析用户请求
1.在实际的开发中用户访问一个姐买你可能有自己的具体操作。我们可以用C++自己的regex类包含的正则表达式的方式处理用户的请求。
如下代码:
#include <stdlib.h>
#include <thread>
#include <string.h>
#include <string>
#include <regex> //C++自带的正则表达啥用法
#include"XTcp.h"using namespace std;class HttpThread
{
public:void Main(){char buffer[10000] = {0}; //这个buffer用来接收和发送数据//接收http客户端请求int recvLen = client.Recv(buffer, sizeof(buffer) - 1); //要保留\0所有是sizeof(buffer) - 1if (recvLen < 0){Close();return;}printf("%s", buffer);printf("================recv===========\n%s==========\n", buffer);/*== = GET / favicon.ico HTTP / 1.1Host: 192.168.16.223 : 8081Connection : keep - aliveUser - Agent : Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 97.0.4692.71 Safari / 537.36Accept : image / avif, image / webp, image / apng, image / svg + xml, image//*,*//*; q = 0.8Referer: http://192.168.16.223:8081/Accept - Encoding : gzip, deflateAccept - Language : en - US, en; q = 0.9, zh - CN; q = 0.8, zh; q = 0.7, en - GB; q = 0.6*/string pattern = "^([A-Z]+) (.+) HTTP/1"; //^表示开始位置,[A-Z]表示取一个A-Z的大写字符,+表示大写字母至少有一个,空格表示在空格之前必须有大写字符//.表示任意字符//回应http GET请求string src = buffer;string rmsg = ""; regex r(pattern);smatch mas; //用来存结果集regex_search(src,mas,r); //源,结果,正则表达式if (mas.size() == 0){printf("%s faild!\n", pattern.c_str());Close();return;}string type = mas[1];string path = mas[2];if (type != "GET"){Close();return;}string filename = path;if (path == "/"){filename = "/index.html";}string filepath = "www";filepath += filename;FILE* fp = fopen(filepath.c_str(), "rb"); //以只读方式打开if (fp == NULL){Close();return;}//获取文件大小fseek(fp, 0, SEEK_END);int filesize = ftell(fp);fseek(fp, 0, 0);printf("file size id %d", filesize);//回应http GET请求rmsg = "HTTP/1.1 200 OK\r\n";//回应一个状态,以\r\n作为分割rmsg += "Server: XHttp\r\n"; //服务器类型rmsg += "Content-Type: text/html\r\n"; //http协议支持各种类型的文件,html,pdf,音视频类型,所以这里告诉它类型rmsg += "Content-Length: "; //现在我们并不知道这个文件的大小char bsize[128] = { 0 };sprintf(bsize, "%d", filesize);rmsg += bsize;//rmsg += "6\r\n"; //先写死加10个数据rmsg += "\r\n\r\n"; //它会在结尾处找独立的\r\n,也就是结尾处有两个\r\n判断协议头结束了的//rmsg += "0123456789"; //至此我们就将消息封装好了//发送消息头int sendSize = client.Send(rmsg.c_str(), rmsg.size());printf("sendSize = %d\n", sendSize);printf("=====================send=============\n%s\n===", rmsg.c_str());//发送正文for (;;){int len = fread(buffer,1,sizeof(buffer),fp);if (len <= 0)break;int re = client.Send(buffer, len);if (re <= 0)break;}Close();}void Close(){client.Close();delete this;}XTcp client;
};int main(int argc, char* argv[])
{unsigned short port = 8081;if (argc > 1){port = atoi(argv[1]);}XTcp server;server.CreateSocket();server.Bind(port);for (;;){XTcp client = server.Accept();HttpThread* th = new HttpThread; //需要考虑什么时候清理这个线程对象th->client = client;std::thread sth(&HttpThread::Main, th); //第二个参数是对象,第一个参数是对象的方法sth.detach(); //表示释放主线程拥有的子线程的资源} //来支持多个客户端server.Close();getchar();return 0;
}
代码分析
string pattern = “^([A-Z]+) (.+) HTTP/1”; //^表示开始位置,[A-Z]表示取一个A-Z的大写字符,+表示大写字母至少有一个,空格表示在空格之前必须有大写字符
//.表示任意字符
对于html文件我们以C语言的fopen方式打开。具体操作请想看代码。如有疑问欢迎留言。
C++socket编程(七):7.4 正则表达式分析用户请求相关推荐
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)
BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) author: wolfenstein 通过上一次的分析,我们已经知道了Tracker采用http协议和客户端通 ...
- linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决
在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...
- Socket 编程概述
前言 Linux Socket 编程领域,为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用.select.poll 和 epoll 是 Linux API 提供的 I/O 复用方式,自从 Li ...
- socket编程学习笔记
socket编程: 1.网络基础知识 两台计算机通过网络进行通信,首先两台计算机要有唯一的标识,即唯一的IP地址.其次他们要有共同的语言用来交流即协议.再者,每套主机要有相应的端口号. TCP/IP协 ...
- 基于 UDP 的 Socket 编程
基于 UDP 的 Socket 编程 UDP的定义 •UDP 是用户数据报协议,提供的是无连接.不可靠信息传送服务.Java 主要提供了两个类来实现基于 UDP 的 Socket 编程. UDP编程的 ...
- OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现
1.网络以覆盖范围划分:局域网/城域网/广域网 互联网/因特网 以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信 IP地址: ...
- 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析
(一) 看看以前学了啥 前面介绍了socket的分类,IP地址,端口号(port),常用的socket数据结构以及常用的函数.现在我们来看一个例子,看看socket编程究竟是什么. (二) 一图看懂客 ...
- python(18):网络编程(七层协议+tcp/udp+socket编程)
Python作为最热门的语言,使我们每个人应该学习的一门技术! 本文针对初学者,我会用最容易的方式告诉你如何入门python! 一.基本网络概念 1.计算机之间如何进行联机 早期: 以太网:局域网与交 ...
- 【并发编程七】C++进程通信——套接字(socket)_80行代码实现一个聊天软件
[并发编程七]进程通信--套接字(socket)_80行代码实现一个聊天软件 一.简介 二.相关知识介绍 1.winsock1.h.winsock2.h 2.如何使用ws2_32.dll 3.WSAS ...
最新文章
- 实时实例分割的Deep Snake:CVPR2020论文点评
- android软件安全权威指南 pdf_AV-TEST 发布 2019 最佳 Android 安全软件榜单
- 除醛重要性美博士环保为您解答!!
- 安装oracle 11g 客户端,检查过程中报物理内存不足的解决
- php伪数组转换为数组,JavaScript伪数组用法实例
- 小白入门机器学习必备:编程语言环境介绍及搭建
- 转:设置Eclipse中的tab键为4个空格的完整方法
- vue修改config后怎么生效_梦幻西游 金银锦盒修改后资金怎么攥 可以考虑跑商
- DevOps、CI、CD是什么关系
- 服务端访问Linux的DNS出现DNS request timed out..
- 2021-04-23 Perl语言入门 导学
- 超全AD软件3D封装库 免费分享!
- 驱动加载工具 DriverLoader 1.0
- 华三交换机dhcp 保留地址
- 4芯网线接法(电话线接网线水晶头)
- 先有蛋还是先有鸡?互联网的线上线下
- shentou mianshiti
- python数据函数定义的规则是什么_Python自定义函数基础概念
- 使用ffmpeg合并音频视频并实现背景音乐循环播放
- 用php完成下拉菜单,最新的8个实现下拉菜单功能的总结
热门文章
- 学习总在继续......
- java中的容器问题
- eclipse-sql server 2008连接
- [OC]数据库的使用--数据读取
- [Email] 收发邮件的协议 : IMAP and SMTP , POP3 and SMTP
- 微型计算机的主要,微型计算机组成,微型计算机主要由什么组成
- 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)
- 2021计算机一级模拟29套,“智慧家”2021年第二十九期每周家庭套餐
- row number函数_窗口函数介绍及案例实战
- 代码管理_阿里巴巴如何管理代码分支?