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

电商网站开发主要技术问题简单html网页制作代码

电商网站开发主要技术问题,简单html网页制作代码,山西建工网登录,制作企业网站的版式select底层原理 fd_set底层使用位图标记每个文件标识符有没有被使用,位图在c语言里靠数组实现。 select 流程 在用户态空间里(栈、堆、数据段)申请一个fd_set将fd_set从用户态拷贝到内核态(在后面操作系统轮询会使用到&#xff09…

select底层原理

fd_set底层使用位图标记每个文件标识符有没有被使用,位图在c语言里靠数组实现。

 

 

select 流程

  1. 在用户态空间里(栈、堆、数据段)申请一个fd_set
  2. 将fd_set从用户态拷贝到内核态(在后面操作系统轮询会使用到)
  3. select调用时候:内核轮询 0~nfds-1;内核在轮询,进程阻塞;
  4. 在轮询中发现有监听的fd就绪,就放入fd_set,并返回
  5. 将fd_set从内核态拷贝到用户态
  6. 用户随后执行FD_ISSET,判断fd是否在就绪态

select的缺陷

  1. 存在多次数据在用户态和内核态空间的来回拷贝
  2. fd_set是一个位图,靠数组实现的,其长度编译时确定(一个进程的文件数量上限ulimit可以直接改,但是 fd_set 的长度需要重新编译系统库)
  3. 监听和就绪集合耦合在一起
  4. (最严重的问题)在就绪之后,用户要根据监听的数量去执行若干次FD_ISSET海量连接,少量就绪。

epoll 高性能 IO多路复用

epoll 和 select 功能是一样的,但是经过 libevent 测试后,epoll 性能更好。

 kqueue只能Unix,epoll只能Linux。

epoll 底层模型

  1.  epoll 将数据结构分配在内核区(文件对象)
  2.  在文件对象内部有两个独立的数据结构:
  • 监听集合是一颗红红黑树(没有上限)
  • 就绪集合是一个线性表

     3.  当轮询结束以后,epoll 会把收集到就绪集合拷贝到用户态,用户遍历就绪结合次数和就绪数量相关(而不是监听集合,性能比select提升)

红黑树

红黑树是一颗相对平衡的二叉搜索树,在内存里涉及到树的操作大量使用到红黑树。

  • 任何节点是红色或者黑色两种之一。
  • 根节点是黑色。
  • 空叶子记为黑色(实际不存在)。
  • 红色节点父亲和孩子都是黑色。
  • 从根出发到每个空节点的简单路径黑色节点数量是一样的。

相关函数

使用 man  7  epoll查看

epoll_creat

创建文件对象

曾经 int epoll_creat(int size)里面的size用来表示监听大小,现在无意义,为了兼容,size填写一个正数,返回一个epoll类型

 

epoll_ctl

管理监听集合

  • epfd: 监听的文件描述符
  • op: 有下面三种类型分别对应增加、修改、删除
  • *event: 监听的属性

op 对应的选项:分别为增加、修改、删除

event 结构体如下:

events基本数据类型(读就绪或写就绪,水平出发或边缘触发)

data数据是一个共用体,可以在ptr、fd、u32、u64里面选择一个,用来记录将来就绪之后,往就绪集合里面放的东西

在监听不同的文件描述符时,要将相应的event调整,并再使用一个epoll_ctl。

union

联合体、共用体

union 的用法和 struct 很像。

但是union 在某一时刻,只能存在一个成员,所有成员共用内存。

设置监听

代码实现

 struct epoll_event event;event.data.fd = STDIN_FILENO;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&event);event.data.fd = netfd;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,netfd,&event);

两个别监听的fd和data务必要不一样 

epoll_wait

内核轮询,用户阻塞

  • epfd 是epoll 的文件描述符。
  • *events 是 maxevents 是合在一起的。event 是一个数组,maxevents 是数组长度,里面存得到是epoll_event类型。这里只看 data 成员。
  • timeout 是最长等待时间,以毫秒为单位,-1 代表永久等待。

使用方法:

  • 主调方先申请一个 struct epoll_event 结构体数组,把数组首地址和长度传递给 epoll_wait
  • epoll_wait 在轮询结束后返回,把每个就绪的fd 的 data 拷贝到数据体数组中
  • 返回值为就绪集合的实际长度。

使用步骤:

struct epoll_event readyset[1024];while(1){int readynum = epoll_wait(epfd,readyset,1024,-1);for(int i=0;i<readynum;i++){if(readyset[i].data.fd = STDIN_FILENO){……}else if(readyset[i].data.fd = netfd){……}
}

  1. 准别一个就绪集合 readyset,大小无所谓
  2. 调用 epoll_wait epfd 就绪集合数组名,数组长度,-1
  3. 从 epoll_wait 当中返回,返回readynum时就绪集合的实际长度
  4. 写一个执行 readysetnum 次的 for 循环遍历就绪集合

支持断线重连的双人通信

基于TCP编程和epoll,实现一个客户端和一个服务端双人即时聊天,服务端需要处理stdin,并支持断线重连

server.c

#include <my_header.h>/* Usage:  */
int main(int argc, char *argv[]){                                  ARGS_CHECK(argc,3);int sockfd = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr(argv[1]);serverAddr.sin_port = htons(atoi(argv[2]));int flag = 1;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(flag));int b_ret = bind(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr));ERROR_CHECK(b_ret,-1,"bind");listen(sockfd,50);    int epfd = epoll_create(1);struct epoll_event event;event.data.fd = STDIN_FILENO;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&event);event.data.fd = sockfd;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&event);char buf[4096];struct epoll_event readyset[1024];int netfd = -1;while(1){int readynum = epoll_wait(epfd,readyset,1024,-1);for(int i=0;i<readynum;i++){if(readyset[i].data.fd == sockfd){netfd = accept(sockfd,NULL,NULL);printf("netfd = %d, client connected\n",netfd);event.data.fd = netfd;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,netfd,&event);event.data.fd = STDIN_FILENO;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,NULL);epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);}else if(netfd != -1 && readyset[i].data.fd == STDIN_FILENO){bzero(buf,sizeof(buf));ssize_t sret = read(STDIN_FILENO,buf,sizeof(buf));if(sret == 0){printf("server close connection\n");epoll_ctl(epfd,EPOLL_CTL_DEL,STDIN_FILENO,NULL);epoll_ctl(epfd,EPOLL_CTL_DEL,netfd,NULL);netfd =-1;goto END;}send(netfd,buf,strlen(buf),0);} else if(netfd != -1 && readyset[i].data.fd == netfd){bzero(buf,sizeof(buf));ssize_t sret = recv(netfd,buf,sizeof(buf),0);if(sret == 0){printf("client disconnected\n");epoll_ctl(epfd,EPOLL_CTL_DEL,STDIN_FILENO,NULL);epoll_ctl(epfd,EPOLL_CTL_DEL,netfd,NULL);event.data.fd = sockfd;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&event);close(netfd);continue;}printf("[buf] %s\n",buf);}}}
END:close(epfd);close(sockfd);return 0;
}

client.c

#include <my_header.h>/* Usage:  */
int main(int argc, char *argv[]){                                  ARGS_CHECK(argc,3);int sockfd = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr(argv[1]);serverAddr.sin_port = htons(atoi(argv[2]));int c_ret = connect(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr));ERROR_CHECK(c_ret,-1,"connect");int epfd = epoll_create(1);struct epoll_event event;event.data.fd = STDIN_FILENO;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&event);event.data.fd = sockfd;event.events = EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&event);char buf[4096];struct epoll_event readyset[1024];while(1){int readynum = epoll_wait(epfd,readyset,1024,-1);for(int i=0;i<readynum;i++){if(readyset[i].data.fd == STDIN_FILENO){bzero(buf,sizeof(buf));ssize_t sret = read(STDIN_FILENO,buf,sizeof(buf));if(sret == 0){printf("client close connection\n");epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);epoll_ctl(epfd,EPOLL_CTL_DEL,STDIN_FILENO,NULL);goto END;}send(sockfd,buf,strlen(buf),0);} if(readyset[i].data.fd == sockfd){bzero(buf,sizeof(buf));ssize_t sret = recv(sockfd,buf,sizeof(buf),0);if(sret == 0){printf("server disconnected\n");epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);epoll_ctl(epfd,EPOLL_CTL_DEL,STDIN_FILENO,NULL);goto END;}printf("[buf] %s\n",buf);}}}
END:close(sockfd);return 0;
}

http://www.dtcms.com/a/488260.html

相关文章:

  • 上架苹果APP的时候在哪里填写APP的隐私政策信息
  • Jar包和War包的区别以及如何选择
  • 杭州网站模板还有什么网站可以做面包车拉货
  • 静态网站结构如何更新中国建设银行陕西省分行网站
  • 深圳品牌网站设计公司价格防内涵吧网站源码
  • 网站申请备案保定建设厅网站
  • 企业网站seo关键词优化排名思路用php做网站
  • 做网站一般用什么 语言wordpress添加文字alt
  • 电子相册在线制作网站wordpress好看分页
  • 多源信息融合+经典卷积网络故障诊断模型合集
  • 视频类网站开发经验资源网站源码下载
  • 大庆市网站建设公司su搜索引擎优化
  • 怎么做网站广告卖钱怎么改wordpress的html
  • wordpress页面和自定义链接叶涛网站推广优化
  • 泰州网站制作费用如何建立外贸网站
  • TIA Portal中运动控制(一)(功能块MC_Power...)
  • c网站开发视频教程龙岩网页
  • 主流大模型快速应用分析
  • 网站数据库怎么建多种语言网站怎么做
  • 出境旅游业务流程
  • 实战针对本地项目git如何移除旧仓库关联并且添加关联新仓库-优雅草卓伊凡
  • 教育网站怎么做引导栏的互动科技 网站建设
  • 在yolo中什么是先验框
  • 遥感卫星升轨 / 降轨技术解析:对图像光照、对比度的影响及工程化应用
  • 企业网站和信息化建设金蝶wordpress绑定多郁闷
  • 怎样做网站的背景图片做搬家广告哪家网站有优
  • 开源安全管理平台wazuh-非法可疑进程检测
  • 做佣金单网站盐田高端网站建设
  • ppt免费制作网站wordpress的中文插件
  • 电脑操作全记录:一键监控键盘鼠标U盘