96SEO 2026-02-19 08:32 35
3.不同资源进行区分反序列化的实现ReadOneLine函数的实现ParseRequestLine函数的实现

Err.hpp(错误)HttpServer.hpp(初始化和启动)Log.hpp(日志)Main.cc(回调函数调用)makefileSock.hpp(TCP套接字)Until.hpp
server的端口号不能随意指定必须是众所周知且不能随便更改的
因为URL本身用一些字符作为特殊字符所以在使用特殊字符时所以特殊符号被转化为16进制格式数字用来和URL本身的特殊字符进行区分
16进制然后从右到左取4位(不足4位直接处理)每2位做一位前面加上%编码成%XY格式
HandlerHttp在是一个完整的http请求报文的前提下分别将状态行
进行文本分析时按行进行分割读取直到找到一行是空行则认为把报头读完了
index.html的内容再将内容传给body字符串中作为有效载荷
创建ReadOneLine函数将message中的第一行的请求行取出
,initial-scale1.0titleDocument/title
{USAGE_ERR1,SOCKET_ERR,//2BIND_ERR,//3LISTEN_ERR,//4SETSID_ERR,//5OPEN_ERR//6
ThreadData{public:ThreadData(int
port,HttpServer*tsvrp)//构造:_sock(sock),_ip(ip),_port(port),_tsvrp(tsvrp){}~ThreadData(){}public:int
defaultport):func(f),port_(port){}void
InitServer()//初始化{listensock_.Socket();//创建套接字listensock_.Bind(port_);//绑定listensock_.Listen();//监听}void
request;//将套接字的数据读取到buffer中ssize_t
srecv(sock,buffer,sizeof(buffer)-1,0);if(s0)//读取成功{buffer[s]0;//将\0赋值给buffer中requestbuffer;std::string
将request变为responsesend(sock,response.c_str(),response.size(),0);//发送
要进行分离pthread_detach(pthread_self());ThreadData*
td(ThreadData*)args;td-_tsvrp-HandlerHttpRequest(td-_sock);close(td-_sock);delete
Start()//启动{for(;;){std::string
socklistensock_.Accept(clientip,clientport);//获取客户端IP和端口号if(sock0){continue;}pthread_t
ThreadData(sock,clientip,clientport,this);pthread_create(tid,nullptr,threadRoutine,td);}}~HttpServer(){}private:int
currtime(nullptr);//获取time_tstruct
buffer[128];snprintf(buffer,sizeof(buffer),%d-%d-%d
%d:%d:%d,tmp-tm_year1900,tmp-tm_mon1,tmp-tm_mday,tmp-tm_hour,tmp-tm_min,tmp-tm_sec);return
level_stringtolevelstring(level);std::string
curr_timegettime();snprintf(logLeft,sizeof(logLeft),%s
%d,level_string.c_str(),curr_time.c_str());//日志右边部分的实现char
p;//p可以看作是1字节的指针va_start(p,format);//将p指向最开始vsnprintf(logRight,sizeof(logRight),format,p);va_end(p);//将指针置空//打印日志
printf(%s%s\n,logLeft,logRight);//保存到文件中FILE*fpfopen(
返回空指针if(fpnullptr){return;}fprintf(fp,%s%s\n,logLeft,logRight);//将对应的信息格式化到流中fflush(fp);//刷新缓冲区fclose(fp);
public:HttpRequest():path_(webRoot){}~HttpRequest(){}void
Print(){logMessage(Debug,method:%s,url:%s,version:%s,method_.c_str(),url_.c_str(),httpVersion_.c_str());/*for(const
autoline:body_){logMessage(Debug,-%s,line.c_str());}*/logMessage(Debug,path:%s,path_.c_str());logMessage(Debug,suffix:%s,suffix_.c_str());}
httpVersion_;//请求版本std::vectorstd::string
lineUtil::ReadOneLine(message,SEP);//在message中根据分隔符读走状态行//将请求行分为
协议版本Util::ParseRequestLine(line,req.method_,req.url_,req.httpVersion_);//解析请求行logMessage(Info,method:%s,url:%s,version:%s,req.method_.c_str(),req.url_.c_str(),req.httpVersion_.c_str());//将状态行处理后剩余请求报头每一次取一行
将其放入body中while(!message.empty()){lineUtil::ReadOneLine(message,SEP);req.body_.push_back(line);}req.path_
//path_在构造时已经默认为web根目录了所以只需加上资源即可//只有一个/需加上默认首页if(req.path_[req.path_.size()-1]/){req.path_
req.suffix_.html;//默认为html}else
{req.suffix_req.path_.substr(pos);}return
suffix.htm){content_typetext/html;}else
if(suffix.js){content_typeapplication/x-javascript;}else
if(suffix.png){content_typeimage/png;}else
if(suffix.jpg){content_typeimage/jpeg;}else
responsecout---------------------------endl;//2.反序列化和分析请求HttpRequest
Deserialize(message);req.Print();//3.使用请求std::string
body;//有效载荷Util::ReadFile(req.path_,body);//将path路径中的内容交给body字符串中//做一次响应
OKSEP;//状态码//Content-Length获取有效载荷长度responseContent-Length:
std::to_string(body.size())SEP;//响应报头responseGetContentType(req.suffix_);response
if(argc!2){exit(USAGE_ERR);}uint16_t
portatoi(argv[1]);std::unique_ptrHttpServer
HttpServer(HandlerHttp,port));tsvr-InitServer();tsvr-Start();return
Socket()//创建套接字{_socksocket(AF_INET,SOCK_STREAM,0);if(_sock0)//套接字创建失败{logMessage(
error,code:%s,errstring:%s,errno,strerror(errno));exit(SOCKET_ERR);}}void
local;memset(local,0,sizeof(local));//清空local.sin_familyAF_INET;//16位地址类型local.sin_port
INADDR_ANY;//IP地址//若小于0则绑定失败if(bind(_sock,(struct
sockaddr*)local,sizeof(local))0){logMessage(
error,code:%s,errstring:%s,errno,strerror(errno));exit(BIND_ERR);}}void
Listen()//将套接字设置为监听状态{//小于0则监听失败if(listen(_sock,gbacklog)0){logMessage(
error,code:%s,errstring:%s,errno,strerror(errno));exit(LISTEN_ERR);}}int
sockaddr*)temp,len);if(sock0){logMessage(Warning,accept
error,code:%s,errstring:%s,errno,strerror(errno));}else
ntohs(temp.sin_port);//客户端的端口号}return
server;memset(server,0,sizeof(server));//清空server.sin_familyAF_INET;//16位地址类型server.sin_porthtons(serverport);//端口号//inet_addr
字符串风格IP转化为4字节风格IPserver.sin_addr.s_addrinet_addr(serverip.c_str());//IP地址//成功返回0失败返回-1return
sockaddr*)server,sizeof(server));}int
Close(){if(_sock!defaultfd){close(_sock);}}~Sock()//析构{}private:int
)//读取整个文件内容{//1.获取文件本身的大小struct
nstat(path.c_str(),st);if(n0)//读取失败{return
st.st_size;//2.调整string的空间fileContent-resize(size);
fdopen(path.c_str(),O_RDONLY);if(fd0)//读取失败{return
false;}read(fd,(char*)fileContent-c_str(),size);//从文件fd中读取放到fileContentclose(fd);logMessage(
true;}//在message中根据分隔符取出状态行static
posmessage.find(sep);//查找sep分隔符,找到则返回pos位置的下标while(posstd::string::npos)//没找到{return
smessage.substr(0,pos);//取[0,pos]区间作为子串message.erase(0,possep.size());从下标为0处开始
*httpVersion){//以空格为单位对内容做提取std::stringstream
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback