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 正则表达式分析用户请求相关推荐

  1. BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) author: wolfenstein 通过上一次的分析,我们已经知道了Tracker采用http协议和客户端通 ...

  2. linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决

    在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...

  3. Socket 编程概述

    前言 Linux Socket 编程领域,为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用.select.poll 和 epoll 是 Linux API 提供的 I/O 复用方式,自从 Li ...

  4. socket编程学习笔记

    socket编程: 1.网络基础知识 两台计算机通过网络进行通信,首先两台计算机要有唯一的标识,即唯一的IP地址.其次他们要有共同的语言用来交流即协议.再者,每套主机要有相应的端口号. TCP/IP协 ...

  5. 基于 UDP 的 Socket 编程

    基于 UDP 的 Socket 编程 UDP的定义 •UDP 是用户数据报协议,提供的是无连接.不可靠信息传送服务.Java 主要提供了两个类来实现基于 UDP 的 Socket 编程. UDP编程的 ...

  6. OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现

    1.网络以覆盖范围划分:局域网/城域网/广域网   互联网/因特网   以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信            IP地址: ...

  7. 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析

    (一) 看看以前学了啥 前面介绍了socket的分类,IP地址,端口号(port),常用的socket数据结构以及常用的函数.现在我们来看一个例子,看看socket编程究竟是什么. (二) 一图看懂客 ...

  8. python(18):网络编程(七层协议+tcp/udp+socket编程)

    Python作为最热门的语言,使我们每个人应该学习的一门技术! 本文针对初学者,我会用最容易的方式告诉你如何入门python! 一.基本网络概念 1.计算机之间如何进行联机 早期: 以太网:局域网与交 ...

  9. 【并发编程七】C++进程通信——套接字(socket)_80行代码实现一个聊天软件

    [并发编程七]进程通信--套接字(socket)_80行代码实现一个聊天软件 一.简介 二.相关知识介绍 1.winsock1.h.winsock2.h 2.如何使用ws2_32.dll 3.WSAS ...

最新文章

  1. 实时实例分割的Deep Snake:CVPR2020论文点评
  2. android软件安全权威指南 pdf_AV-TEST 发布 2019 最佳 Android 安全软件榜单
  3. 除醛重要性美博士环保为您解答!!
  4. 安装oracle 11g 客户端,检查过程中报物理内存不足的解决
  5. php伪数组转换为数组,JavaScript伪数组用法实例
  6. 小白入门机器学习必备:编程语言环境介绍及搭建
  7. 转:设置Eclipse中的tab键为4个空格的完整方法
  8. vue修改config后怎么生效_梦幻西游 金银锦盒修改后资金怎么攥 可以考虑跑商
  9. DevOps、CI、CD是什么关系
  10. 服务端访问Linux的DNS出现DNS request timed out..
  11. 2021-04-23 Perl语言入门 导学
  12. 超全AD软件3D封装库 免费分享!
  13. 驱动加载工具 DriverLoader 1.0
  14. 华三交换机dhcp 保留地址
  15. 4芯网线接法(电话线接网线水晶头)
  16. 先有蛋还是先有鸡?互联网的线上线下
  17. shentou mianshiti
  18. python数据函数定义的规则是什么_Python自定义函数基础概念
  19. 使用ffmpeg合并音频视频并实现背景音乐循环播放
  20. 用php完成下拉菜单,最新的8个实现下拉菜单功能的总结

热门文章

  1. 学习总在继续......
  2. java中的容器问题
  3. eclipse-sql server 2008连接
  4. [OC]数据库的使用--数据读取
  5. [Email] 收发邮件的协议 : IMAP and SMTP , POP3 and SMTP
  6. 微型计算机的主要,微型计算机组成,微型计算机主要由什么组成
  7. 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)
  8. 2021计算机一级模拟29套,“智慧家”2021年第二十九期每周家庭套餐
  9. row number函数_窗口函数介绍及案例实战
  10. 代码管理_阿里巴巴如何管理代码分支?