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

宁波网站模板哪家性价比高举报网站建设公司

宁波网站模板哪家性价比高,举报网站建设公司,集团网站 wordpress,今天兰州最新消息select、poll、epoll三者的实现#xff1a; select实现TCP高并发服务器的流程#xff1a; 一、创建套接字#xff08;socket函数#xff09;#xff1a;二、填充服务器的网络信息结构体#xff1a;三、套接字和服务器的网络信息结构体进行绑定#xff08;bind函数 select实现TCP高并发服务器的流程 一、创建套接字socket函数二、填充服务器的网络信息结构体三、套接字和服务器的网络信息结构体进行绑定bind函数四、套接字设置成被动监听listen函数五、创建要监听的文件描述符集合使用select函数后会将没有就绪的文件描述符在集合中去除所以需要创建两个文件描述符集合一个是母本read_fds类似于常量保持不变而另一个作为副本read_fds_t类似于变量可以改变 fd_set read_fds;FD_ZERO(read_fds);fd_set read_fds_t;FD_ZERO(read_fds_t);六、把创建的套接字添加到要监视的集合中 FD_SET(sockfd,read_fds);int fd_max 0;fd_max fd_max sockfd ? fd_max : sockfd;七、设置系统时间结构体变量用来指定超时的时间 struct timeval tm_out;八、等待文件描述符中的事件是否就绪成功则返回就绪的文件描述符的个数select函数select函数 #include sys/select.hint select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);/*参数nfds 要监视的最大文件描述符1readfds 要监视的读文件描述符集合 不关心可以传NULLwritefds 要监视的写文件描述符集合 不关心可以传NULLexceptfds 要监视的异常文件描述符集合 不关心可以传NULLtimeout 超时时间 如果设置成NULL 会一直阻塞 直到有文件描述符就绪返回值成功 就绪的文件描述符的个数超时 0失败 -1 重置错误码*///struct timeval 可以指定超时时间//如果结构体的两个成员都为0 表示非阻塞struct timeval {long tv_sec; //秒 long tv_usec; //微秒};void FD_CLR(int fd, fd_set *set); //将文件描述符在集合中删除int FD_ISSET(int fd, fd_set *set); //判断文件描述符是否还在集合中// 返回0 表示不在了 非0 表示在void FD_SET(int fd, fd_set *set); //向集合中添加一个文件描述符void FD_ZERO(fd_set *set); //清空集合 if(-1 (ret select(fd_max 1,read_fds_t,NULL,NULL,tm_out))){perror(select error);exit(-1);}else if(0 ret){puts(timeout!!!!!);putchar(\n);continue;}九、遍历文件描述符集合判断哪些文件描述符已经准备就绪 for(int i 3; i fd_max 1 0 ! ret; i){...}十、判断文件描述符是否还在集合中并且接收来自客户端的数据recv函数和给客户端发送应答消息send函数 if(FD_ISSET(i,read_fds_t)){//说明有新的客户端连接服务器if(i sockfd){ if(-1 (accept_fd accept(sockfd,NULL,NULL))){perror(accept error);exit(-1);}printf(客户端[%d]连接到服务器\n,accept_fd);//将新连接的客户端的套接字添加到要监视的集合中FD_SET(accept_fd,read_fds);fd_max fd_max accept_fd ? fd_max : accept_fd;}else //之前连接的客户端在向服务器发送信息{memset(buf,0,sizeof(buf));if(-1 (nbytes recv(i,buf,sizeof(buf),0))){perror(recv error);exit(-1);}else if(0 nbytes){printf(客户端[%d]已断开连接\n,i);//将已断开连接客户端的套接字在文件描述符集合中剔除FD_CLR(i,read_fds);//关闭套接字close(i);continue;}if(!strncmp(buf,quit,4)){printf(客户端[%d]已退出\n,i);//将已断开连接客户端的套接字在文件描述符集合中剔除FD_CLR(i,read_fds);//关闭套接字close(i);continue;}printf(客户端[%d]发来信息[%s]\n,i,buf);//组装应答消息strcat(buf,----------k);//给客户端发送应答消息if(-1 send(i,buf,sizeof(buf),0)){perror(send error);exit(-1);}}ret--; //减少遍历次数}十一、关闭套接字close函数 poll实现TCP高并发服务器的流程 一、创建套接字socket函数二、填充服务器的网络信息结构体三、套接字和服务器的网络信息结构体进行绑定bind函数四、套接字设置成被动监听listen函数五、创建要监听的文件描述符集合并清空文件描述符集合 //创建要监听的文件描述符集合struct pollfd new_fds[2048] {0};//清空文件描述符集合for(int i 0; i 2048; i){new_fds[i].fd -1;}六、把创建的套接字添加到要监视的集合中 FD_SET(sockfd,read_fds);int fd_max 0;fd_max fd_max sockfd ? fd_max : sockfd;七、套接字添加到要监视的集合中并且设置要监听的事件 //套接字添加到要监视的集合中new_fds[0].fd sockfd;//设置要监听的事件new_fds[0].events | POLLIN;八、记录文件描述符集合中最大的文件描述符并且设置超时的时间 //记录文件描述符集合中最大的文件描述符int fd_max 0;fd_max fd_max sockfd ? fd_max : sockfd;//设置超时的时间int tm_out 10000;九、等待文件描述符中的事件是否就绪成功则返回就绪的文件描述符的个数poll函数poll实现TCP中型并发服务器与select实现TCP小型并发服务器的区别就是无需每次重置集合,并且可以设置要监视的最大文件描述符的个数而select至多监视1024个文件描述符poll函数 #include poll.hint poll(struct pollfd *fds, nfds_t nfds, int timeout);/*参数fds要监视的文件描述符的集合指向自定义的结构体数据nfdsfds中已经使用的项目的个数timeout超时时间单位是毫秒 设置成10000 表示10s-1 永久阻塞0 非阻塞返回值0 超时-1 出错 重置错误码正数 成功 返回的就绪的文件描述符的个数*/struct pollfd {int fd; /* 文件描述符 设置成-1 内核就不再监视这一位了*/short events; /* 要监视的事件 */short revents; /* 返回的事件 */};/*要监视的事件是用位运算或起来的要监视的事件放在events字段,而实际就绪的事件在revents字段返回POLLIN 读事件POLLOUT 写时间POLLERR 异常事件*/ if(-1 (ret poll(new_fds,fd_max,tm_out))){perror(poll error);exit(-1);}else if(0 ret){puts(timeout!!!!!);putchar(\n);continue;}十、遍历文件描述符集合判断哪些文件描述符已经准备就绪 for(k 0; k fd_max ret ! 0; k){ ...}十一、找到实际就绪的事件的文件描述符并且接收来自客户端的数据recv函数和给客户端发送应答消息send函数 //找到实际就绪的事件的文件描述符if(0 ! (new_fds[k].revents POLLIN)){//说明有新的客户端连接服务器if(new_fds[k].fd sockfd){if(-1 (accept_fd accept(sockfd,NULL,NULL))){perror(accept error);exit(-1);}printf(客户端[%d]连接到服务器\n,accept_fd);//将新连接的客户端的套接字添加到要监视的集合中//遍历文件描述符集合给新的文件描述符找一个位置for(j 0; j 2048; j){if(-1 new_fds[j].fd){new_fds[j].fd accept_fd;new_fds[j].events | POLLIN;fd_max fd_max accept_fd ? fd_max : accept_fd;break;}}if(2048 j){//此时集合容量满了close(accept_fd);}}else //之前连接的客户端在向服务器发送信息{memset(buf,0,sizeof(buf));if(-1 (nbytes recv(new_fds[k].fd,buf,sizeof(buf),0))){perror(recv error);exit(-1);}else if(0 nbytes){printf(客户端[%d]已断开连接\n,new_fds[k].fd);//将已断开连接客户端的套接字在文件描述符集合中剔除close(new_fds[k].fd);new_fds[k].fd -1;continue;}if(!strncmp(buf,quit,4)){printf(客户端[%d]已退出\n,new_fds[k].fd);//将已断开连接客户端的套接字在文件描述符集合中剔除close(new_fds[k].fd);new_fds[k].fd -1;continue;}printf(客户端[%d]发来信息[%s]\n,new_fds[k].fd,buf);//组装应答消息strcat(buf,----------k);//给客户端发送应答消息if(-1 send(new_fds[k].fd,buf,sizeof(buf),0)){perror(send error);exit(-1);}}ret--; //减少遍历次数}十二、关闭套接字close函数 epoll实现TCP高并发服务器的流程 一、创建套接字socket函数通信域选择IPV4网络协议、套接字类型选择流式 int sock_fd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器和客户机的网络信息结构体1.分别定义服务器网络信息结构体变量serveraddr和客户机网络信息结构体变量clientaddr2.分别求出服务器和客户机的网络信息结构体变量的内存空间大小以作备用3.网络信息结构体清04.使用IPV4网络协议AF_INET5.在终端预留服务器端主机的IP地址inet_addr(argv[1])6.在终端预留服务器端网络字节序的端口号htons(atoi(argv[2])) struct sockaddr_in serveraddr; //定义服务器网络信息结构体变量struct sockaddr_in clientaddr;socklen_t serveraddr_len sizeof(serveraddr);//求出服务器结构体变量的内存空间大小socklen_t clientaddr_len sizeof(clientaddr);//求出客户机结构体变量的内存空间大小memset(serveraddr,0,serveraddr_len); //服务器结构体清零memset(clientaddr,0,clientaddr_len);//客户机结构体清零serveraddr.sin_family AF_INET; //使用IPV4网络协议serveraddr.sin_addr.s_addr inet_addr(argv[1]); //IP地址serveraddr.sin_port htons(atoi(argv[2]));//网络字节序的端口号三、设置允许端口复用setsockopt函数setsockopt函数功能设置套接字属性 #include sys/types.h#include sys/socket.hint setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen); /*参数sockfd套接字level 选项的级别套接字API级别 SOL_SOCKETTCP级别 IPPROTO_TCPIP级别 IPPROTO_IPoptname选项的名字套接字API级别SO_BROADCAST 是否允许发送广播SO_RCVBUF 接收缓冲区的大小SO_SNDBUF 发送缓冲区的大小SO_RCVTIMEO 接收超时时间参数使用的是 struct timeval 结构体如果超时了 函数调用会立即返回-1并将错误码置成 EAGAINSO_SNDTIMEO 发送超时时间SO_REUSEADDR 端口复用TCP级别TCP_NODELAY 使能/禁用Nagle算法IP级别IP_ADD_MEMBERSHIP 设置加入多播组optval 选项的值没有特殊说明时 使用的都是int类型optlenoptval的大小返回值成功 0失败 -1 重置错误码*/特别注意使用setsockopt设置允许端口复用时其在代码的位置在填充网络信息结构体和bind之间 int reuse 1;if(-1 (setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,reuse,sizeof(reuse)))){perror(setsockopt error);exit(-1);}四、套接字和服务器的网络信息结构体进行绑定bind函数 五、套接字设置成被动监听listen函数 六、创建红黑树epoll_create函数 #include sys/epoll.hint epoll_create(int size);/*功能创建epoll/创建epoll实例的描述符参数size:参数已经被忽略了只需要填写大于0的值即可返回值epoll_create 调用成功时会返回一个非负整数epfd表示新创建的 epoll 实例的文件描述符如果调用失败则返回 -1并设置 errno 变量以指示具体错误原因*/int epfd epoll_create(1);if(-1 epfd){perror(epoll_create error);exit(-1);}七、定义事件结构体变量和存放就绪事件描述符的数组事件结构体epoll_event用于描述一个文件描述符上的事件 typedef union epoll_data {void *ptr;int fd; uint32_t u32;uint64_t u64;} epoll_data_t; struct epoll_event {uint32_t events; //EPOLLIN 读 / EPOLLOUT 写epoll_data_t data; //存放用户的数据}; struct epoll_event event;struct epoll_event events[N];八、将关心的文件描述符加入到红黑树epoll_ctl函数功能epoll的控制操作或者用于向 epoll 实例中添加、修改、删除事件epoll_ctl函数 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);/*参数epfd:epoll的文件描述符op:控制方式EPOLL_CTL_ADD添加EPOLL_CTL_MOD修改EPOLL_CTL_DEL删除fd:被操作的文件描述符event:事件结构体指针返回值 成功返回0失败返回-1 置位错误码*///添加要检测事件的描述符event.events EPOLLIN;event.data.fd sock_fd;//将关心的文件描述符加入到红黑树if(-1 (epoll_ctl(epfd,EPOLL_CTL_ADD,sock_fd,event))){perror(epoll_ctl error);exit(-1);}九、等待文件描述符中的事件是否就绪成功则返回就绪的文件描述符的个数epoll_wait函数epoll_wait函数 int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);/*参数epfd:epoll的文件描述符events:准备好的事件的结构体地址maxevents:返回的最大的文件描述符的个数timeout:超时0 :毫秒级别的超时时间0 :立即返回-1:不关心超时时间返回值成功返回准备好的文件描述符的个数返回0代表超时时间到了失败返回-1置位错误码*/if(-1 (ret epoll_wait(epfd,events,N,-1))){perror(epoll_wait error);exit(-1);} 十、遍历就绪的文件描述符集判断哪些文件描述符已经准备就绪 for(int i 0; i ret; i){...}十一、找到实际就绪的事件的文件描述符并且接收来自客户端的数据recv函数和给客户端发送应答消息send函数 if(events[i].data.fd sock_fd){//获取连接成功后新的客户端new_fd accept(sock_fd,(struct sockaddr *)clientaddr,clientaddr_len);if(-1 new_fd){perror(accept error);exit(-1);}printf(文件描述符[%d]客户端[%s:%d]连接到了服务器\n,new_fd,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));//添加要检测的文件描述符event.events EPOLLIN;event.data.fd new_fd;if(-1 (epoll_ctl(epfd,EPOLL_CTL_ADD,new_fd,event))){perror(epoll_ctl error);exit(-1);}printf(文件描述符[%d]成功挂载在红黑树上\n,new_fd);}else{memset(buf,0,sizeof(buf));int old_fd events[i].data.fd;if(-1 (nbytes recv(old_fd,buf,sizeof(buf),0))){perror(recv error);exit(-1);}else if(0 nbytes){printf(文件描述符[%d]客户端断开了服务器\n,old_fd);//关闭对应的文件描述符close(old_fd);//剔除挂在树上对应的文件描述符epoll_ctl(epfd,EPOLL_CTL_DEL,old_fd,event);}if(!strncmp(buf,quit,4)){printf(文件描述符[%d]客户端退出了服务器\n,old_fd);//关闭对应的文件描述符close(old_fd);//剔除挂在树上对应的文件描述符epoll_ctl(epfd,EPOLL_CTL_DEL,old_fd,event);}printf(文件描述符[%d]客户端发来数据[%s]\n,old_fd,buf);//组装应答消息strcat(buf,-----k);//给客户端发送应答消息send(old_fd,buf,sizeof(buf),0); 十二、关闭套接字close函数 select、poll、epoll三者的区别
http://www.w-s-a.com/news/740327/

相关文章:

  • 公司域名查询官方网站女教师遭网课入侵直播录屏曝
  • 网站开发社交网络功能的作用腾讯公司网站
  • 网站建设需要微信账号和密码网站建设工作汇报
  • 国家城乡住房和建设部网站西安私人网站
  • 天津高端网站定制seo实战教程
  • 网站文章怎么做才能被快速收录网站备案核验系统
  • 子网站建设方案l建设银行网站
  • 免费看舆情网站网站备案用户名忘了怎么办
  • 地方门户网站的分类网站的方案
  • 沧州哪里做网站网站的建设是什么
  • 设计公司海报秦皇岛seo网站推广
  • 网站导航规划wordpress做漫画
  • jsp体育用品网站建设wordpress 10万篇文章
  • 沈阳做微信和网站的公司网站在线支付接口
  • 重庆整合网络营销百度seo快速提升排名
  • 设计师网站外网百度分析工具
  • 旅游网站建设技术解决方案wordpress主题安装后找不到
  • 网站图片文字排版错误管理系统界面设计
  • 网站建设 台州广州惠科互联网技术有限公司
  • 网站页面尺寸大小四川鸿业建设集团网站
  • 做女朋友的网站局网站建设方案word
  • 做阿里国际网站会有成效吗科技网站有哪些
  • 高端公司网站建设北京两学一做网站
  • 黄埔网站建设设计wordpress 文件夹改名
  • 怎么什么软件可以吧做网站最火的二十个电商app
  • wordpress theme sage网站seo优化加推广
  • 建设一个大型电影网站公司网站建设工作总结
  • 传奇网站一般怎么做的宇泽佛山网站建设
  • google网站入口电商运营十大基础知识
  • 建设公司网站的细节中国建设网网站