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

phpcms旅游网站模板自建网站和第三方平台的区别

phpcms旅游网站模板,自建网站和第三方平台的区别,网站开发软件排名,大学生网页制作成品模板csocket的select函数以及多路复用 1.select函数原型使用示例及解释 2.select()函数返回值3.select()函数与socket阻塞的关系与原因4.select函数的意义5.深入理解select模型#xff08;1#xff09;特点#xff08;2#xff09;带外数据#xff08;2#xff09;select函数… csocket的select函数以及多路复用 1.select函数原型使用示例及解释 2.select()函数返回值3.select()函数与socket阻塞的关系与原因4.select函数的意义5.深入理解select模型1特点2带外数据2select函数相关的常见的几个宏3select使用范例及结论 6.多路复用及代码示例 1.select函数原型 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);参数说明 nfds需要监视的最大文件描述符值加1。 readfds、writefds、exceptfds分别表示可读、可写和异常事件的文件描述符集合。这些集合是用fd_set结构体表示的。 timeout指定超时时间如果为NULL则select函数会一直阻塞直到有事件发生。如果指定为0则select函数会立即返回用于轮询文件描述符的状态。 select函数的返回值是就绪文件描述符的个数。如果返回0表示超时如果返回-1表示出错。 使用select函数的步骤如下 (1)准备需要监视的文件描述符集合并初始化它们。 (2)调用select函数进行文件描述符的监视。 (3)检查select函数的返回值判断哪些文件描述符就绪。 (4)对就绪的文件描述符进行相应的操作 使用示例及解释 #include iostream #include sys/types.h #include sys/socket.h int main() { int sockfd; fd_set readfds; struct timeval timeout; // 创建socket sockfd socket(AF_INET, SOCK_STREAM, 0);// 设置需要监视的文件描述符集合 FD_ZERO(readfds); FD_SET(sockfd, readfds);// 设置超时时间 timeout.tv_sec 5; timeout.tv_usec 0;// 监视文件描述符 int ret select(sockfd 1, readfds, NULL, NULL, timeout); if (ret -1) {std::cout select error std::endl; } else if (ret 0) {std::cout timeout std::endl; } else {if (FD_ISSET(sockfd, readfds)) {std::cout socket is readable std::endl;} }return 0; 解释 首先创建了一个socket并将其添加到readfds集合中。然后设置了一个超时时间为5秒调用select函数进行文件描述符的监视。如果select函数返回0表示超时如果返回-1表示出错如果返回大于0表示有文件描述符就绪。通过FD_ISSET宏来判断sockfd是否就绪如果就绪则输出socket is readable。 需要注意的是在使用select函数之前需要将文件描述符集合进行初始化并将需要监视的文件描述符添加到对应的集合中。另外如果监视的文件描述符集合很大可以使用FD_SETSIZE常量来表示文件描述符集合的大小。 2.select()函数返回值 select的返回值与recv函数的返回值十分类似都分0,0,0三种情况。 (1) 0:有事件发生 (2)0timeout超时 此时需要先FD_ZERO(),FD_SET();再select。 原因 要监视的文件描述符在位图中被置1当有事件发生时文件描述符仍为1但没有事件发生的文件描述符会被置0所以要想监视所有的文件描述符第2此循环需要重新将所有的文件描述符进行FD_SET();置1设置。 (3)0:出错。 在出错的情况下当错误为EINTR认为连接是正常的继续接收 if(errno EINTR)continue; 报此错误需要继续select;不需要FD_ZERO(),FD_SET(); select函数没有(errno EAGAIN)||errno EWOULDBLOCK)错误 这两种错误是recv和send是会出现的错误 3.select()函数与socket阻塞的关系与原因 关系 select()与socket是否阻塞没有任何关系也就是说无论socket是阻塞状态还是非阻塞态都可以与select进行搭配。 原因 当某个设备是阻塞的时候相当于处于sleep的状态即让出CPU 但当设备处于非阻塞态时会不断的轮询占用CPU故默认的是阻塞态。 4.select函数的意义 1)select函数是多路IO复用故当有多路IO的时候会发挥优势 2当某一路IO处于阻塞态时select监视到其他的IO有读或写就可以让其他路的IO读写如果没有select,当有一路IO阻塞其他的IO即使可以读写也无法进行。 5.深入理解select模型 1特点 取fd_set长度为1字节fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。 1执行fd_set set; FD_ZERO(set); 则set用位表示是0000,0000。 2若fd5,执行FD_SET(fd,set);后set变为0001,0000(第5位置为1) 3若再加入fd2fd1,则set变为0001,0011 4执行select(6,set,0,0,0)阻塞等待 5若fd1,fd2上都发生可读事件则select返回此时set变为0000,0011。注意没有事件发生的fd5被清空。 基于上面的讨论可以轻松得出select模型的特点 1可监控的文件描述符个数取决与sizeof(fd_set)的值。我这边服务器上sizeof(fd_set)512每bit表示一个文件描述符则我服务器上支持的最大文件描述符是512*84096。据说可调另有说虽然可调但调整上限受于编译内核时的变量值。 2将fd加入select监控集的同时还要再使用一个数据结构array保存放到select监控集中的fd一是用于再select返回后array作为源数据和fd_set进行FD_ISSET判断。二是select返回后会把以前加入的但并无事件发生的fd清空则每次开始select前都要重新从array取得fd逐一加入FD_ZERO最先扫描array的同时取得fd最大值maxfd用于select的第一个参数。 3可见select模型必须在select前循环加fd取maxfdselect返回后利用FD_ISSET判断是否有事件发生。 2带外数据 带外数据(out—of—band data)有时也称为加速数据(expedited data) 是指连接双方中的一方发生重要事情想要迅速地通知对方。 这种通知在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。 带外数据设计为比普通数据有更高的优先级。 带外数据是映射到现有的连接中的而不是在客户机和服务器间再用一个连接。 2select函数相关的常见的几个宏 #include sys/select.h int FD_ZERO(int fd, fd_set *fdset); //一个 fd_set类型变量的所有位都设为 0 int FD_CLR(int fd, fd_set *fdset); //清除某个位时可以使用 int FD_SET(int fd, fd_set *fdset); //设置变量的某个位置位 int FD_ISSET(int fd, fd_set *fdset); //测试某个位是否被置位3select使用范例及结论 当声明了一个文件描述符集后必须用FD_ZERO将所有位置零。之后将我们所感兴趣的描述符所对应的位置位操作如下 fd_set rset; int fd; FD_ZERO(rset); FD_SET(fd, rset); FD_SET(stdin, rset);然后调用select函数拥塞等待文件描述符事件的到来如果超过设定的时间则不再等待继续往下执行 select(fd1, rset, NULL, NULL,NULL); select返回后用FD_ISSET测试给定位是否置位 if(FD_ISSET(fd, rset) { ... //do something }结论 select模型的关键是使用一种有序的方式对多个套接字进行统一管理与调度 。用户首先将需要进行IO操作的socket添加到select中然后阻塞等待select系统调用返回。当数据到达时socket被激活select函数返回。用户线程正式发起read请求读取数据并继续执行。 从流程上来看使用select函数进行IO请求和同步阻塞模型没有太大的区别甚至还多了添加监视socket以及调用select函数的额外操作效率更差。但是使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket然后不断地调用select读取被激活的socket即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中必须通过多线程的方式才能达到这个目的。 6.多路复用及代码示例 C中使用多路复用技术来处理socket可以提高程序的性能和效率。多路复用允许一个进程同时监听多个socket当任何一个socket准备好进行读写操作时进程就可以对其进行相应的处理。 在C中可以使用select、poll或者epoll等系统调用来实现多路复用。这些系统调用可以监视一组socket的状态变化包括可读、可写、异常等事件。 代码示例 #include iostream #include sys/types.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include unistd.h #include cstdlib #include cstringint main() {// 创建socketint serverSocket socket(AF_INET, SOCK_STREAM, 0);if (serverSocket -1) {std::cerr Failed to create socket std::endl;return -1;}// 设置socket地址sockaddr_in serverAddress{};serverAddress.sin_family AF_INET;serverAddress.sin_port htons(8080);serverAddress.sin_addr.s_addr INADDR_ANY;// 绑定socket地址if (bind(serverSocket, (struct sockaddr*)serverAddress, sizeof(serverAddress)) -1) {std::cerr Failed to bind socket std::endl;close(serverSocket);return -1;}// 监听socketif (listen(serverSocket, SOMAXCONN) -1) {std::cerr Failed to listen on socket std::endl;close(serverSocket);return -1;}// 设置文件描述符集合fd_set readSet;FD_ZERO(readSet);FD_SET(serverSocket, readSet);// 循环等待socket事件while (true) {// 复制文件描述符集合fd_set tempSet readSet;// 调用select等待事件发生if (select(FD_SETSIZE, tempSet, nullptr, nullptr, nullptr) -1) {std::cerr Failed to select std::endl;close(serverSocket);return -1;}// 遍历文件描述符集合for (int fd 0; fd FD_SETSIZE; fd) {// 检查是否有事件发生if (FD_ISSET(fd, tempSet)) {// 如果是serverSocket有事件发生表示有新的连接请求if (fd serverSocket) {sockaddr_in clientAddress{};socklen_t clientAddressSize sizeof(clientAddress);// 接受新的连接int clientSocket accept(serverSocket, (struct sockaddr*)clientAddress, clientAddressSize);if (clientSocket -1) {std::cerr Failed to accept connection std::endl;close(serverSocket);return -1;}std::cout New connection accepted std::endl;// 将新的连接加入文件描述符集合FD_SET(clientSocket, readSet);}// 否则表示有数据可读else {// 读取数据char buffer[1024];memset(buffer, 0, sizeof(buffer));ssize_t bytesRead recv(fd, buffer, sizeof(buffer) - 1, 0);if (bytesRead -1) {std::cout Failed to receive data std::endl;close(serverSocket);return -1;}// 处理数据if (bytesRead 0) {std::cout Connection closed std::endl;close(fd);FD_CLR(fd, readSet);} else {std::cout Received data: buffer std::endl;}}}}}// 关闭socketclose(serverSocket);return 0; }
http://wiki.neutronadmin.com/news/390368/

相关文章:

  • 怎么给自己的品牌做网站如何做好网页设计
  • 网站建设单页装修公司怎么找客源最有效
  • 大连网站建设哪里好中国建筑集团有限公司怎么样
  • 网站开发广告语大全品牌策划设计
  • 常德建设网站多少钱如何搭建wordpress商城
  • 站长之家0西宁建设公司网站
  • 找人做jsp网站wordpress网站根目录
  • 土巴兔网站开发wordpress .htaccess 301重定向
  • 建设网站案例优化大师官方正版下载
  • 网站建设一年多少钱如何调整
  • 温州企业网站设计有关做聚合物电池公司的网站
  • 长沙县好的建站按效果付费做网店装修的网站有哪些内容
  • 哪里有建设网站中的视频下载公司装修装饰
  • 建站模板与网站案例展示职业生涯规划
  • 网站如何做跳转58同城推广效果怎么样
  • 网站建设是干什么h5制作完成后怎么导出
  • 外贸品牌网站建设推广
  • 深圳网站建设方案服务公司在线网站流量查询
  • 庄浪县县住房建设局网站电商运营有几大平台
  • 青海培训网站建设公司带数据库网站模板
  • 慈溪怎么做网站淮南做网站推广
  • 网站正在建设中动画推荐几个高端大气上档次网站
  • 酒店官方网站的功能建设动态wordpress动态主题
  • 太原做网站公司运营制作单页网站
  • 城市建设杂志社网站免费主题大全下载
  • 指定关键字 网站有更新就提醒做网站找外包公司要要搞清楚什么
  • 百度网站地图模板2022年装修效果图大全
  • 网站推广的方法枫子马蹄室内设计官网
  • 谷歌下载官方正版关键词优化的价格查询
  • canvas 特效网站网页源代码简单