当前位置: 首页 > news >正文

做网站专业行业网站开发程序

做网站专业,行业网站开发程序,免费小程序网站,网络销售怎样找客户### 知识点1#xff1a;读取网络数据 客户端发送给服务器的通信数据通过封装的bufferSocketRead函数读取读取的数据存储在struct Buffer结构体实例中#xff0c;可将该实例作为参数传递给解析函数 回顾Buffer.c中的bufferSocketRead函数 // 写内存 2.接收套接字数据 int b…### 知识点1读取网络数据 客户端发送给服务器的通信数据通过封装的bufferSocketRead函数读取读取的数据存储在struct Buffer结构体实例中可将该实例作为参数传递给解析函数 回顾Buffer.c中的bufferSocketRead函数 // 写内存 2.接收套接字数据 int bufferSocketRead(struct Buffer* buf,int fd) {struct iovec vec[2]; // 根据自己的实际需求// 初始化数组元素int writeableSize bufferWriteableSize(buf); // 得到剩余的可写的内存容量// 0号数组里的指针指向buf里边的数组记得 要加writePos防止覆盖数据vec[0].iov_base buf-data buf-writePos;vec[0].iov_len writeableSize;char* tmpbuf (char*)malloc(40960); // 申请40k堆内存vec[1].iov_base buf-data buf-writePos;vec[1].iov_len 40960;// 至此结构体vec的两个元素分别初始化完之后就可以调用接收数据的函数了int result readv(fd, vec, 2);// 表示通过调用readv函数一共接收了多少个字节if(result -1) {return -1;// 失败了}else if (result writeableSize) { buf-writePos result;}else {buf-writePos buf-capacity; // 需要先更新buf-writePosbufferAppendData(buf, tmpbuf, result - writeableSize);}free(tmpbuf);return result; } ### 知识点2从Buffer中读取请求行 需要编写一个操作函数根据换行符\r\n从buffer中提取一行数据memem函数应返回找到的子数据块在内存中的起始位置----注意数据块的大小并在函数中指定 一、解析请求行通过指针方式解析非 sscanf 方式 GET / HTTP/1.1 Host: www.baidu.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,/;q0.8 Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 Accept-Encoding: gzip, deflate, br Connection: keep-alive Cookie: BAIDUID6729CB682DADC2CF738F533E35162D98:FG1; BIDUPSID6729CB682DADC2CFE015A8099199557E; PSTM1614320692; BD_UPN13314752; BDORZFFFB88E999055A3F8A630C64834BD6D0; __yjs_duid1_d05d52b14af4a339210722080a668ec21614320694782; BD_HOME1; H_PS_PSSID33514_33257_33273_31660_33570_26350; BA_HECTOR8h2001alag0lag85nk1g3hcm60q Upgrade-Insecure-Requests: 1 Cache-Control: max-age0 空行 请求数据为空 http get请求报文的格式 请求行\r\n 请求头\r\n 空行(\r\n)提示: 每项信息之间都需要一个\r\n是由http协议规定************************************************ ************************************************ http post请求报文的格式 请求行\r\n 请求头\r\n 空行(\r\n) 请求体提示: 请求体就是浏览器发送给服务器的数据 提取请求行  1在Buffer.h新增一个函数叫 bufferFindCRLF函数其功能是根据\r\n取出一行,找到其在数据块中的位置返回该位置 // 根据\r\n取出一行,找到其在数据块中的位置返回该位置 char* bufferFindCRLF(struct Buffer* buf); // CRLF表示\r\n char* bufferFindCRLF(struct Buffer* buf) {// strstr -- 从大字符串中去匹配子字符串遇到\0结束// memmem -- 从大数据块中去匹配子数据块需要指定数据块大小char* ptr memmem(buf-data buf-readPos,bufferReadableSize(buf),\r\n,2);return ptr; } 2HttpRequest.h  新增一个函数叫 parseHttpRequestLine函数用于解析请求行 // 解析请求行 bool parseHttpRequestLine(struct HttpRequest* req,struct Buffer* readBuf); // 解析请求行 bool parseHttpRequestLine(struct HttpRequest* req,struct Buffer* readBuf) {// 读取请求行char* end bufferFindCRLF(readBuf);// 保存字符串起始位置char* start readBuf-data readBuf-readPos;// 保存字符串结束地址int lineSize end - start;if(lineSize0) {// get /xxx/xx.txt http/1.1// 请求方式char* space memmem(start,lineSize, ,1);assert(space!NULL);int methodSize space - start;req-method (char*)malloc(methodSize 1);strncpy(req-method,start,methodSize);req-method[methodSize] \0;// 请求静态资源start space 1;space memmem(start,end-start, ,1);assert(space!NULL);int urlSize space - start;req-url (char*)malloc(urlSize 1);strncpy(req-url,start,urlSize);req-url[urlSize] \0;// http 版本start space 1;req-version (char*)malloc(end-start 1);strncpy(req-version,start,end-start);req-version[end-start] \0;// 解析请求行完毕为解析请求头做准备readBuf-readPos lineSize;readBuf-readPos 2;// 修改状态 解析请求头req-curState ParseReqHeaders;return true;}retrun false; } 二、优化解析请求行代码 如果想要在一个函数里边给外部的一级指针分配一块内存,那么需要把外部的一级指针的地址传递给函数。外部的一级指针的地址也就是二级指针,把二级指针传进来之后,对它进行解引用,让其指向我们申请的一块堆内存,就可以实现外部的一级指针被初始化了也就分配到了一块内存 注意:传入指针的地址(二级指针),这个函数涉及给指针分配一块内存,指针在作为参数的时候会产生一个副本而把指针的地址作为参数传入不会产生副本 char* splitRequestLine(const char* start,const char* end,const char* sub,char** ptr) {char* space (char*)end;if(sub ! NULL) {space memmem(start,end-start,sub,strlen(sub));assert(space!NULL);}int length space - start;char* tmp (char*)malloc(length1);strncpy(tmp,start,length);tmp[length] \0;*ptr tmp;// 对ptr进行解引用*ptr(一级指针),让其指向tmp指针指向的地址return space1; } // 解析请求行 bool parseHttpRequestLine(struct HttpRequest* req,struct Buffer* readBuf) {// 读取请求行char* end bufferFindCRLF(readBuf);// 保存字符串起始位置char* start readBuf-data readBuf-readPos;// 保存字符串结束地址int lineSize end - start;if(lineSize0) {start splitRequestLine(start,end, ,req-method);// 请求方式start splitRequestLine(start,end, ,req-url);// url资源splitRequestLine(start,end,NULL,req-version);// 版本 #if 0// get /xxx/xx.txt http/1.1// 请求方式char* space memmem(start,lineSize, ,1);assert(space!NULL);int methodSize space - start;req-method (char*)malloc(methodSize 1);strncpy(req-method,start,methodSize);req-method[methodSize] \0;// 请求静态资源start space 1;space memmem(start,end-start, ,1);assert(space!NULL);int urlSize space - start;req-url (char*)malloc(urlSize 1);strncpy(req-url,start,urlSize);req-url[urlSize] \0;// http 版本start space 1;req-version (char*)malloc(end-start 1);strncpy(req-version,start,end-start);req-version[end-start] \0; #endif// 为解析请求头做准备readBuf-readPos lineSize;readBuf-readPos 2;// 修改状态req-curState ParseReqHeaders;return true;}return false; } 三、解析请求头并存储 ### 解析请求头数据 1.数据存储在对应的Buffer结构内存块中。解析时需要将readPos更新到请求头的起始位置parseHttpRequestLine函数中已经为解析请求头做好了准备。 回顾一下parseHttpRequestLine函数: bool parseHttpRequestLine(struct HttpRequest* request, struct Buffer* readBuf) {...if (lineSize0){start splitRequestLine(start, end, , request-method);start splitRequestLine(start, end, , request-url);splitRequestLine(start, end, NULL, request-version);// 为解析请求头做准备readBuf-readPos lineSize;readBuf-readPos 2;// 修改状态request-curState ParseReqHeaders;return true;}return false; } 2.请求头的每行为一对键值对包含一个key值和一个value值 3.将数据行存储到堆内存中并将堆内存地址传递给httpRequestAddHeader函数 回顾一下httpRequestAddHeader函数 void httpRequestAddHeader(struct HttpRequest* request, const char* key, const char* value) {request-reqHeaders[request-reqHeadersNum].key (char*)key;request-reqHeaders[request-reqHeadersNum].value (char*)value;request-reqHeadersNum; } ### 解析请求头数据 该函数处理请求头中的一行 标准HTTP协议中键值和值之间使用冒号分隔冒号后有一个空格使用memem函数检查中间指针是否指向冒号 // 解析请求头 bool parseHttpRequestHeader(struct HttpRequest* req,struct Buffer* readBuf); // 该函数处理请求头中的一行 bool parseHttpRequestHeader(struct HttpRequest* req,struct Buffer* readBuf) {char* end bufferFindCRLF(readBuf);if(end!NULL) {char* start readBuf-data readBuf-readPos;int lineSize end - start;// 基于 搜索字符串char* middle memmem(start,lineSize,: ,2); if(middle!NULL) {// 拿出键值对char* key malloc(middle - start 1);strncpy(key,start,middle - start);key[middle - start] \0;// 获得keychar* value malloc(end - middle - 2 1);// end-(middle2) 1 end - middle - 2 1strncpy(value,middle2,end - middle - 2);value[end - middle - 2] \0;// 获得valuehttpRequestAddHeader(req,key,value);// 添加键值对// 移动读数据的位置readBuf-readPos lineSize;readBuf-readPos 2;}else {// 请求头被解析完了,跳过空行readBuf-readPos 2;// 修改解析状态// 本项目忽略 post 请求按照 get 请求处理req-curState ParseReqDone;}return true;}return false; } ## 注意事项 总结提取请求行 和 解析请求行和优化 这篇博客和 本文需要注意的细节如下 在解析请求行和头部时需要提供相应的解析函数解析函数应返回布尔值表示解析是否成功在读取网络数据时需要使用封装的bufferSocketRead函数来读取数据读取的数据存储在struct Buffer结构体实例中该实例作为参数传递给解析函数
http://www.hkea.cn/news/14382634/

相关文章:

  • 太原营销型网站建设制作网站大多用源码来做吗
  • 江门住房城乡建设厅网站德州营销型网站
  • 哪些网站可以做设计赚钱佛山新网站建设怎么样
  • 咸宁网站设计公司谷歌广告代理商
  • 深圳前海网站设计网页升级紧急通知拿笔记好
  • 建设手机版网站需要主机多少空间做网站手机验证收费吗
  • 济南网站建设销售招聘如何撤销网站上信息吗
  • 个人网站做支付宝收款网站建设与管理 吴振峰
  • 网站抓取qq号码原理厦门网站设计哪家公司好
  • 保定网站开发公司常州手机网站开发
  • 怎么分享网站建设一个网站多少钱呢
  • 陕西 汽车 网站建设二级学院网站制度建设
  • 深圳网站制作公司 讯500强网站建设
  • 徐州网站建设价格网络系统软件应用与维护
  • 网络推广方法技巧优化关键词的方法包括
  • 无版权视频素材网站网站建设有那些
  • 天水模板型网站建设电子商务静态网站建设心得
  • 烟台做网站的价格免费咨询聊天
  • 织梦网站根目录标签网站建设 设计方案 百度文库
  • 网站显示结算必应收录提交入口
  • 国字型网站建设布局成都筑巢网站建设
  • 有做的小说网站深圳网站建设开发哪家好
  • 贵阳快速建站模板有哪些网站可以做任务
  • 美耐皿 技术支持 东莞网站建设lnmp一键包wordpress
  • 网站优化图片链接怎么做南京制作网站要多少钱
  • 网站点内页还是首页平面设计发展前景
  • 水墨风格网站企业网站前期建设
  • 网站怎么自己做服务器手机微网站建设案例及报告
  • 个人网站上传有啥要求wordpress 下载按钮插件
  • 建设银行金牛支行网站成都建筑公司排名