做网站如何推销网站排名优化软件有哪些
- 作者: 五速梦信息网
- 时间: 2026年03月19日 09:55
当前位置: 首页 > news >正文
做网站如何推销,网站排名优化软件有哪些,黑马程序员上海校区,抖音竞价推广怎么做文章目录 1 使用的知识点2 http请求get 和 post的区别 3 整体功能介绍4 基于epoll的web服务器开发流程5 服务器代码6 libevent版本的本地web服务器 1 使用的知识点 2 http请求 get 和 post的区别
http协议请求报文格式: 1 请求行 GET /test.txt HTTP/1.1 2 请求行 健值对 3 空… 文章目录 1 使用的知识点2 http请求get 和 post的区别 3 整体功能介绍4 基于epoll的web服务器开发流程5 服务器代码6 libevent版本的本地web服务器 1 使用的知识点 2 http请求 get 和 post的区别
http协议请求报文格式: 1 请求行 GET /test.txt HTTP/1.1 2 请求行 健值对 3 空行 \r\n 4 数据
http协议响应消息格式: 1 状态行 200 表示成功, 404 表示请求的资源不存在 2 消息报头 健值对 3 空行 \r\n 4 响应正文
3 整体功能介绍 4 基于epoll的web服务器开发流程 创建socket得到监听文件描述符lfd——socket 设置端口复用——setsockopt() 绑定——bind 设置监听——listen 创建epoll树得到树根描述符epfd——epoll_create() 将监听文件描述符lfd上树——epoll_ctr(epfd,epoll_CTL_ADD…)\ while(1) { // 等待事件发生 nread epoll_wait(); if(nread 0) { if(errno EINTR) { continue; } break; } // 下面是有事件发生循环处理没一个文件描述符 for(i 0; inready;i) { sockfd event[i].data.fd; // 有客户端连接请求到来 if(sockfd lfd) { cfd accept(); // 将新的cfd 上树 epoll_ctl(epfd, EPOLL_CTL_ADD…); }// 有数据发来的情况else{// 接受数据并进行处理http_request();}} }
int http_request(inf cfd) { // 读取请求行 Readline(); // 分析请求行得到要请求的资源文件夹file 如 GET/hanzi.c /HTTP1.1 // 循环读完剩余的内核缓冲区的数据 while((n Readline())0); // 判断文件是否存在 stat(); 1. 文件不存在 返回错误页 组织应答消息 http响应格式消息 错误页正文内容 2. 文件存在 判断文件类型 2.1 普通文件 组织应答信息: http响应格式信息消息正文 2.2 目录文件 组织应答消息 http响应格式消息 html格式文件内容
}
5 服务器代码
//web服务端程序–使用epoll模型
#include unistd.h
#include sys/epoll.h
#include fcntl.h
#include sys/stat.h
#include string.h
#include signal.h
#include dirent.h#include pub.h
#include wrap.hint http_request(int cfd, int epfd);int main()
{//若web服务器给浏览器发送数据的时候, 浏览器已经关闭连接, //则web服务器就会收到SIGPIPE信号struct sigaction act;act.sa_handler SIG_IGN;sigemptyset(act.sa_mask);act.sa_flags 0;sigaction(SIGPIPE, act, NULL);//改变当前进程的工作目录char path[255] {0};sprintf(path, %s/%s, getenv(HOME), webpath);chdir(path);//创建socket–设置端口复用—bindint lfd tcp4bind(9999, NULL);//设置监听Listen(lfd, 128);//创建epoll树int epfd epoll_create(1024);if(epfd0){perror(epoll_create error);close(lfd);return -1;}//将监听文件描述符lfd上树struct epoll_event ev;ev.data.fd lfd;ev.events EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, ev);int i;int cfd;int nready;int sockfd;struct epoll_event events[1024];while(1){//等待事件发生nready epoll_wait(epfd, events, 1024, -1);if(nready0){if(errnoEINTR){continue;}break;}for(i0; inready; i){sockfd events[i].data.fd;//有客户端连接请求if(sockfdlfd){//接受新的客户端连接cfd Accept(lfd, NULL, NULL);//设置cfd为非阻塞int flag fcntl(cfd, F_GETFL);flag | O_NONBLOCK;fcntl(cfd, F_SETFL, flag);//将新的cfd上树ev.data.fd cfd;ev.events EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, ev);}else {//有客户端数据发来http_request(sockfd, epfd);} } }
}int send_header(int cfd, char *code, char *msg, char *fileType, int len)
{char buf[1024] {0};sprintf(buf, HTTP/1.1 %s %s\r\n, code, msg);sprintf(bufstrlen(buf), Content-Type:%s\r\n, fileType);if(len0){sprintf(bufstrlen(buf), Content-Length:%d\r\n, len);}strcat(buf, \r\n);Write(cfd, buf, strlen(buf));return 0;
}int send_file(int cfd, char *fileName)
{//打开文件int fd open(fileName, O_RDONLY);if(fd0){perror(open error);return -1;}//循环读文件, 然后发送int n;char buf[1024];while(1){memset(buf, 0x00, sizeof(buf));n read(fd, buf, sizeof(buf));if(n0){break;}else {Write(cfd, buf, n);}}
}int http_request(int cfd, int epfd)
{int n;char buf[1024];//读取请求行数据, 分析出要请求的资源文件名memset(buf, 0x00, sizeof(buf));n Readline(cfd, buf, sizeof(buf));if(n0){//printf(read error or client closed, n[%d]\n, n);//关闭连接close(cfd);//将文件描述符从epoll树上删除epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, NULL);return -1; }printf(buf[%s]\n, buf);//GET /hanzi.c HTTP/1.1char reqType[16] {0};char fileName[255] {0};char protocal[16] {0};sscanf(buf, %[^ ] %[^ ] %[^ \r\n], reqType, fileName, protocal);//printf([%s]\n, reqType);printf(–[%s]–\n, fileName);//printf([%s]\n, protocal);char *pFile fileName;if(strlen(fileName)1){strcpy(pFile, ./);}else {pFile fileName1;}//转换汉字编码strdecode(pFile, pFile);printf([%s]\n, pFile);//循环读取完剩余的数据,避免产生粘包while((nReadline(cfd, buf, sizeof(buf)))0);//判断文件是否存在struct stat st;if(stat(pFile, st)0){printf(file not exist\n);//发送头部信息send_header(cfd, 404, NOT FOUND, get_mime_type(.html), 0);//发送文件内容send_file(cfd, error.html); }else //若文件存在{//判断文件类型//普通文件if(S_ISREG(st.st_mode)){printf(file exist\n);//发送头部信息send_header(cfd, 200, OK, get_mime_type(pFile), st.st_size);//发送文件内容send_file(cfd, pFile);}//目录文件else if(S_ISDIR(st.st_mode)){printf(目录文件\n);char buffer[1024];//发送头部信息send_header(cfd, 200, OK, get_mime_type(.html), 0); //发送html文件头部send_file(cfd, html/dir_header.html); //文件列表信息struct dirent **namelist;int num;num scandir(pFile, namelist, NULL, alphasort);if (num 0){perror(scandir);close(cfd);epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, NULL);return -1;}else {while (num–) {printf(%s\n, namelist[num]-d_name);memset(buffer, 0x00, sizeof(buffer));if(namelist[num]-d_typeDT_DIR){sprintf(buffer, lia href%s/%s/a/li, namelist[num]-d_name, namelist[num]-d_name);}else{sprintf(buffer, lia href%s%s/a/li, namelist[num]-d_name, namelist[num]-d_name);}free(namelist[num]);Write(cfd, buffer, strlen(buffer));}free(namelist);}//发送html尾部sleep(10);send_file(cfd, html/dir_tail.html); }}return 0;
}
6 libevent版本的本地web服务器
//通过libevent编写的web服务器
#include stdio.h
#include unistd.h
#include stdlib.h
#include fcntl.h
#include string.h
#include sys/types.h
#include sys/stat.h
#include sys/wait.h
#include pub.h
#include event.h
#include event2/listener.h
#include dirent.h#define _WORKDIR %s/webpath
#define _DIR_PREFIXFILE html/dir_header.html
#define _DIR_TAILFILE html/dir_tail.htmlint copy_header(struct bufferevent *bev,int op,char *msg,char *filetype,long filesize)
{char buf[4096]{0};sprintf(buf,HTTP/1.1 %d %s\r\n,op,msg);sprintf(buf,%sContent-Type: %s\r\n,buf,filetype);if(filesize 0){sprintf(buf,%sContent-Length:%ld\r\n,buf,filesize);}strcat(buf,\r\n);bufferevent_write(bev,buf,strlen(buf));return 0;
}
int copy_file(struct bufferevent *bev,const char *strFile)
{int fd open(strFile,O_RDONLY);char buf[1024]{0};int ret;while( (ret read(fd,buf,sizeof(buf))) 0 ){bufferevent_write(bev,buf,ret);}close(fd);return 0;
}
//发送目录实际上组织一个html页面发给客户端目录的内容作为列表显示
int send_dir(struct bufferevent *bev,const char *strPath)
{//需要拼出来一个html页面发送给客户端copy_file(bev,_DIR_PREFIXFILE);//send dir info DIR *dir opendir(strPath);if(dir NULL){perror(opendir err);return -1;}char bufline[1024]{0};struct dirent *dent NULL;while( (dent readdir(dir) ) ){struct stat sb;stat(dent-d_name,sb);if(dent-d_type DT_DIR){//目录文件 特殊处理//格式 a hrefdirname/dirname/apsize/pptime/p/brmemset(bufline,0x00,sizeof(bufline));sprintf(bufline,lia href%s/%32s/a %8ld/li,dent-d_name,dent-d_name,sb.st_size);bufferevent_write(bev,bufline,strlen(bufline));}else if(dent-d_type DT_REG){//普通文件 直接显示列表即可memset(bufline,0x00,sizeof(bufline));sprintf(bufline,lia href%s%32s/a %8ld/li,dent-d_name,dent-d_name,sb.st_size);bufferevent_write(bev,bufline,strlen(bufline));}}closedir(dir);copy_file(bev,_DIR_TAILFILE);//bufferevent_free(bev);return 0;
}
int http_request(struct bufferevent *bev,char *path)
{strdecode(path, path);//将中文问题转码成utf-8格式的字符串char *strPath path;if(strcmp(strPath,/) 0 || strcmp(strPath,/.) 0){strPath ./;}else{strPath path1;}struct stat sb;if(stat(strPath,sb) 0){//不存在 给404页面copy_header(bev,404,NOT FOUND,get_mime_type(error.html),-1);copy_file(bev,error.html);return -1;}if(S_ISDIR(sb.st_mode)){//处理目录copy_header(bev,200,OK,get_mime_type(ww.html),sb.st_size);send_dir(bev,strPath);}if(S_ISREG(sb.st_mode)){//处理文件//写头copy_header(bev,200,OK,get_mime_type(strPath),sb.st_size);//写文件内容copy_file(bev,strPath);}return 0;
}void read_cb(struct bufferevent *bev, void *ctx)
{char buf[256]{0};char method[10],path[256],protocol[10];int ret bufferevent_read(bev, buf, sizeof(buf));if(ret 0){sscanf(buf,%[^ ] %[^ ] %[^ \r\n],method,path,protocol);if(strcasecmp(method,get) 0){//处理客户端的请求char bufline[256];write(STDOUT_FILENO,buf,ret);//确保数据读完while( (ret bufferevent_read(bev, bufline, sizeof(bufline)) ) 0){write(STDOUT_FILENO,bufline,ret);}http_request(bev,path);//处理请求}}
}
void bevent_cb(struct bufferevent *bev, short what, void *ctx)
{if(what BEV_EVENT_EOF){//客户端关闭printf(client closed\n);bufferevent_free(bev);}else if(what BEV_EVENT_ERROR){printf(err to client closed\n);bufferevent_free(bev);}else if(what BEV_EVENT_CONNECTED){//连接成功printf(client connect ok\n);}
}
void listen_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void *arg)
{//定义与客户端通信的buffereventstruct event_base *base (struct event_base *)arg;struct bufferevent *bev bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);bufferevent_setcb(bev,read_cb,NULL,bevent_cb,base);//设置回调bufferevent_enable(bev,EV_READ|EV_WRITE);//启用读和写
}int main(int argc,char *argv[])
{char workdir[256] {0};sprintf(workdir,_WORKDIR,getenv(HOME));//HOME/home/itheima chdir(workdir);struct event_base *base event_base_new();//创建根节点struct sockaddr_in serv;serv.sin_family AF_INET;serv.sin_port htons(9999);serv.sin_addr.s_addr htonl(INADDR_ANY);struct evconnlistener * listener evconnlistener_new_bind(base,listen_cb, base, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,(struct sockaddr *)serv, sizeof(serv));//连接监听器event_base_dispatch(base);//循环event_base_free(base); //释放根节点evconnlistener_free(listener);//释放链接监听器return 0;
}
- 上一篇: 做网站如何添加视频企业墙面设计
- 下一篇: 做网站软件frontpage做任务拿赏金的网站
相关文章
-
做网站如何添加视频企业墙面设计
做网站如何添加视频企业墙面设计
- 技术栈
- 2026年03月19日
-
做网站如何让用户注册网站建站 免费
做网站如何让用户注册网站建站 免费
- 技术栈
- 2026年03月19日
-
做网站如何接单子手机网站开发语言
做网站如何接单子手机网站开发语言
- 技术栈
- 2026年03月19日
-
做网站软件frontpage做任务拿赏金的网站
做网站软件frontpage做任务拿赏金的网站
- 技术栈
- 2026年03月19日
-
做网站软件图标是一个箭头的ysl免费网站建设
做网站软件图标是一个箭头的ysl免费网站建设
- 技术栈
- 2026年03月19日
-
做网站软件有哪些网站批量上传服务器
做网站软件有哪些网站批量上传服务器
- 技术栈
- 2026年03月19日
