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

做中英双语切换的网站网站建设多少时间

做中英双语切换的网站,网站建设多少时间,灵武住房和城乡建设厅网站,网站开发手机号能在页面上显示吗文章目录 模拟select通信过程 但有客户端正在处理数据,新增一台客户端请求建立连接当N台服务器都处于通信状态,其中有一台由于客户端断开处在G处,如果它立即重新请求连接,请分析它的过程当N台服务器都处于通信状态,其中有一台由于客户端断开处在G处,如果它立即重新请求连接, 并… 文章目录 模拟select通信过程 但有客户端正在处理数据,新增一台客户端请求建立连接当N台服务器都处于通信状态,其中有一台由于客户端断开处在G处,如果它立即重新请求连接,请分析它的过程当N台服务器都处于通信状态,其中有一台由于客户端断开处在G处,如果它立即重新请求连接, 并且连接后立即发送数据 ,请分析它的过程复杂一点的模拟为什么不能同时处理 A的数据和B C的数据总结 #include stdio.h #include stdlib.h #include unistd.h #include string.h #include arpa/inet.hint main() {// 1. 创建监听的fdint lfd socket(AF_INET, SOCK_STREAM, 0);// 2. 绑定struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons(9999);addr.sin_addr.s_addr INADDR_ANY;bind(lfd, (struct sockaddr*)addr, sizeof(addr));// 3. 设置监听listen(lfd, 128);// 将监听的fd的状态检测委托给内核检测int maxfd lfd;// 初始化检测的读集合fd_set rdset;fd_set rdtemp;// 清零FD_ZERO(rdset);// 将监听的lfd设置到检测的读集合中FD_SET(lfd, rdset);// 通过select委托内核检测读集合中的文件描述符状态, 检测read缓冲区有没有数据// 如果有数据, select解除阻塞返回// 应该让内核持续检测 上面的代码不在分析范围之内 while(1){// 默认阻塞// rdset 中是委托内核检测的所有的文件描述符rdtemp rdset;int num select(maxfd1, rdtemp, NULL, NULL, NULL); //--------------- A// rdset中的数据被内核改写了, 只保留了发生变化的文件描述的标志位上的1, 没变化的改为0// 只要rdset中的fd对应的标志位为1 - 缓冲区有数据了// 判断// 有没有新连接if(FD_ISSET(lfd, rdtemp)) // -----------------B {// 接受连接请求, 这个调用不阻塞struct sockaddr_in cliaddr;int cliLen sizeof(cliaddr);int cfd accept(lfd, (struct sockaddr*)cliaddr, cliLen); // ---------------- C// 得到了有效的文件描述符// 通信的文件描述符添加到读集合// 在下一轮select检测的时候, 就能得到缓冲区的状态FD_SET(cfd, rdset); // ----------------D// 重置最大的文件描述符maxfd cfd maxfd ? cfd : maxfd; // --------- E}// 没有新连接, 通信for(int i0; imaxfd1; i){// 判断从监听的文件描述符之后到maxfd这个范围内的文件描述符是否读缓冲区有数据if(i ! lfd FD_ISSET(i, rdtemp)) // ------------ F {// 接收数据char buf[10] {0};// 一次只能接收10个字节, 客户端一次发送100个字节// 一次是接收不完的, 文件描述符对应的读缓冲区中还有数据// 下一轮select检测的时候, 内核还会标记这个文件描述符缓冲区有数据 - 再读一次// 循环会一直持续, 知道缓冲区数据被读完位置int len read(i, buf, sizeof(buf)); if(len 0) // ---------------------- G {printf(客户端关闭了连接...\n);// 将检测的文件描述符从读集合中删除FD_CLR(i, rdset); //------------------------------ H close(i);}else if(len 0){// 收到了数据// 发送数据write(i, buf, strlen(buf)1);}else{// 异常perror(read);}}}} 模拟select通信过程 假设现在有N个客户端 如果客户端都只建立连接,而不传输数据 的情况. 程序运行到 A 处 时, select 会 判断 监听描述符(lfd) 和 通信描述符(cfd) 的 读 缓冲区是否有数据, 若有数据 则将对应文件描述符 的 读缓冲区 有数据的文件描述符 置为 1 由于客户端不进行传输数据, 只会请求建立连接, 故只有 监听描述符(lfd ) 的读缓冲区设为1.(实际上客户端的写缓冲区也有数据,但我们并不关心客户端的写缓冲区,select 也没有 检查 写缓冲区的数据) 继续运行到 B 处时 由于 lfd 读缓冲区有数据 ,FD_ISSET(lfd, rdtemp) 为真, 故执行if 语句内容, 继续运行到 C 处时, accpet 返回一个 和 服务端进行连接的 cfd ,但仍然需要检查这个cfd 的读缓冲区时候有数据, 故将其加入读集合,等待下次select 进行检测读缓冲区. 此时程序运行到D 处. 继续运行到 E 处, 将我们得到的 cfd 和 maxfd 比较大小 (更新maxfd), 这个 maxfd 是 在 select 内部起作用的, select 会 循环遍历 文件描述符,符 判断文件描述符的读缓冲区 ,maxlfd 用于 限制 遍历的上 界. 程序运行到 F 处时 会检测 监听描述符 (cfd) 的读缓冲区, 由于客户端 不传输数据 ,所以直接进入下一次while 循环. 但有客户端正在处理数据,新增一台客户端请求建立连接 假设前 N -1 台客户端 处于连接 但 不 传输数据的 状态 , 第 N 台客户端由于在F 处检测到读缓冲区有数据, 此时正在传输数据. 此时 第 N1 台客户端 请求建立连接. 第 N1 台客户端并不会阻塞等待第 N 台 客户端完成数据传输( read 函数不是还在读取第N台客户端的数据吗?? ), 而是成功建立连接. 原因如下: 这涉及到网络编程中的并发处理和非阻塞I/O。在我的例子中服务器使用了select()函数来同时处理多个网络连接。这就是所谓的I/O多路复用技术。 并发处理服务器可以同时处理多个客户端的连接请求而不是顺序地一个接一个地处理。这是通过创建一个文件描述符集合在你的例子中是rdset并使用select()函数来检测这些文件描述符的状态变化例如是否有新的连接请求或者已连接的客户端是否有可读的数据。非阻塞I/O当服务器调用select()函数时如果没有任何文件描述符的状态变化那么这个函数会阻塞直到有状态变化发生。然而一旦有文件描述符的状态变化例如有新的连接请求select()函数就会立即返回而不会等待其他文件描述符例如正在传输数据的客户端。这就意味着服务器不会因为一个客户端正在传输数据而阻塞等待。 因此即使第N台客户端正在传输数据第N1台客户端也可以发送连接请求并且服务器可以接受这个请求而不会阻塞等待第N台客户端完成数据传输。 在我的假设中前N-1台客户端已经连接但不传输数据第N台客户端正在传输数据。当第N1台客户端请求建立连接时这是会发生的 在A处select()函数会阻塞并等待任何文件描述符包括监听文件描述符和已连接的客户端文件描述符的状态变化。这包括新的连接请求和已连接的客户端有可读的数据。当第N1台客户端发出连接请求时监听文件描述符在这个例子中是lfd的状态会变化。因此select()函数会返回并且FD_ISSET(lfd, rdtemp)在B处将会为真。在C处服务器会接受第N1台客户端的连接请求。这将创建一个新的文件描述符我们可以称之为cfdN1来与第N1台客户端通信。在D处新的文件描述符cfdN1会被添加到读集合rdset中以便在下一轮select()检测时能够得知其状态。在E处如果新的文件描述符cfdN1大于当前的最大文件描述符maxfd那么它将成为新的最大文件描述符。 因此即使前N台客户端已经连接并且第N台客户端正在传输数据服务器仍然可以接受第N1台客户端的新连接请求。 当N台服务器都处于通信状态,其中有一台由于客户端断开处在G处,如果它立即重新请求连接,请分析它的过程 当N台服务器都处于通信状态其中有一台由于客户端断开而处在G处时如果它立即重新请求连接以下是可能的过程 在G处服务器检测到客户端已经断开连接因此它会关闭与该客户端的连接使用close(i)并从文件描述符集合中移除该文件描述符使用FD_CLR(i, rdset)。如果客户端立即重新请求连接监听文件描述符在这个例子中是lfd的状态会变化。因此select()函数会返回并且FD_ISSET(lfd, rdtemp)在B处将会为真。在C处服务器会接受客户端的新连接请求。这将创建一个新的文件描述符我们可以称之为cfdNew来与客户端通信。在D处新的文件描述符cfdNew会被添加到读集合rdset中以便在下一轮select()检测时能够得知其状态。在E处如果新的文件描述符cfdNew大于当前的最大文件描述符maxfd那么它将成为新的最大文件描述符。 因此即使有一台服务器由于客户端断开而处在G处只要客户端立即重新请求连接服务器就可以立即接受这个新的连接请求。 服务器使用了select()函数来同时处理多个网络连接这就是所谓的I/O多路复用技术。这意味着服务器可以同时处理多个客户端的连接请求和数据传输而不是顺序地一个接一个地处理,客户端不会等待其他客户端通信完,才会被受理. 当N台服务器都处于通信状态,其中有一台由于客户端断开处在G处,如果它立即重新请求连接, 并且连接后立即发送数据 ,请分析它的过程 当N台服务器都处于通信状态其中有一台由于客户端断开而处在G处时如果它立即重新请求连接并且连接后立即发送数据以下是可能的过程 在G处服务器检测到客户端已经断开连接因此它会关闭与该客户端的连接使用close(i)并从文件描述符集合中移除该文件描述符使用FD_CLR(i, rdset)。如果客户端立即重新请求连接监听文件描述符在这个例子中是lfd的状态会变化。因此select()函数会返回并且FD_ISSET(lfd, rdtemp)在B处将会为真。在C处服务器会接受客户端的新连接请求。这将创建一个新的文件描述符我们可以称之为cfdNew来与客户端通信。在D处新的文件描述符cfdNew会被添加到读集合rdset中以便在下一轮select()检测时能够得知其状态。在E处如果新的文件描述符cfdNew大于当前的最大文件描述符maxfd那么它将成为新的最大文件描述符。如果客户端在连接后立即发送数据那么在下一轮的 select() 检测时由于 cfdNew 的状态发生了变化有数据可读 select() 函数会返回并且 FD_ISSET(cfdNew, rdtemp) 在 F 处将会为真。在 F 处服务器会读取客户端发送的数据并处理这些数据。 因此即使有一台服务器由于客户端断开而处在 G 处只要客户端立即重新请求连接并发送数据服务器就可以接受这个新的连接请求并处理这些数据。希望这个解释能帮助你理解 复杂一点的模拟 假设我们有四个客户端A、B、C和D和一个使用select()函数的服务器。 初始状态所有客户端都已连接到服务器服务器正在监听所有客户端的文件描述符。客户端A发送数据客户端A发送一些数据。select()函数检测到客户端A的文件描述符状态变化返回并处理这些数据。客户端B和C同时发送数据在服务器处理客户端A的数据时客户端B和C同时发送数据。由于select()函数可以同时处理多个文件描述符的状态变化所以它会在处理完客户端A的数据后立即返回并开始处理客户端B和C的数据。客户端D请求连接在服务器处理客户端B和C的数据时客户端D发送连接请求。select()函数检测到监听文件描述符的状态变化返回并接受客户端D的连接请求。客户端A断开连接在服务器接受客户端D的连接请求后客户端A断开连接。服务器检测到这个状态变化关闭与客户端A的连接并从文件描述符集合中移除该文件描述符。客户端D发送数据最后客户端D发送一些数据。服务器检测到这个状态变化返回并处理这些数据。 为什么不能同时处理 A的数据和B C的数据 在使用select()函数的服务器中虽然select()函数可以同时监控多个文件描述符的状态变化但是处理这些状态变化例如接受新的连接请求读取或写入数据的代码是在一个单线程中顺序执行的。 这就意味着如果一个操作例如读取大量数据或执行计算密集型任务需要花费很长时间那么这个线程将会被占用直到这个操作完成。在此期间服务器无法处理其他操作例如接受新的连接请求因为它们都在同一个线程中。 即使在这个期间有新的连接请求到来select()函数也无法被调用因为它在等待当前的操作完成。所以说其他的操作必须等待。 这就是为什么我们说在使用select()函数实现的服务器中并不是所有的操作都是并发执行的。对于需要处理大量并发连接或执行复杂操作的应用程序可能需要使用其他技术例如多线程、多进程或异步I/O。 总结 select()函数是一种I/O多路复用技术它的主要特点和作用如下 并发处理select()函数可以同时处理多个网络连接。它通过创建一个文件描述符集合并检测这些文件描述符的状态变化例如是否有新的连接请求或者已连接的客户端是否有可读的数据。非阻塞I/O当服务器调用select()函数时如果没有任何文件描述符的状态变化那么这个函数会阻塞直到有状态变化发生。然而一旦有文件描述符的状态变化例如有新的连接请求select()函数就会立即返回而不会等待其他文件描述符例如正在传输数据的客户端。这就意味着服务器不会因为一个客户端正在传输数据而阻塞等待。文件描述符限制select()函数使用一个位图来表示文件描述符集合位图的大小通常由操作系统限制通常为1024。这意味着select()函数只能同时监控有限数量的文件描述符。效率问题每次调用select()函数时都需要遍历整个文件描述符集合来检查哪些文件描述符的状态发生了变化。当文件描述符数量很大时这将导致效率问题。 因此虽然select()函数实现的TCP服务器端代码可以同时处理多个网络连接但它并不是完全并发的。对于需要处理大量并发连接或执行复杂操作的应用程序可能需要使用其他技术例如多线程、多进程或异步I/O。希望这个总结能帮助你理解 这意味着select()函数只能同时监控有限数量的文件描述符。 4. 效率问题每次调用select()函数时都需要遍历整个文件描述符集合来检查哪些文件描述符的状态发生了变化。当文件描述符数量很大时这将导致效率问题。 因此虽然select()函数实现的TCP服务器端代码可以同时处理多个网络连接但它并不是完全并发的。对于需要处理大量并发连接或执行复杂操作的应用程序可能需要使用其他技术例如多线程、多进程或异步I/O。希望这个总结能帮助你理解
http://wiki.neutronadmin.com/news/331314/

相关文章:

  • wordpress 全站搜索财政网站平台建设不足
  • 网站展示英文都用什么字体天津百度网站快速优化
  • 玩具网站 下载自己怎么做淘宝网站
  • wordpress 建站插件广州百度推广优化排名
  • 新手学做网站 pdf 下载做网站如何连数据库
  • seo案例分析及解析为什么seo工资不高
  • 成品网站w灬源码在线看站长之家seo工具
  • 个人摄影作品网站wordpress学习 知乎
  • 鞍山市城市建设网站广西南宁网站推广
  • 福州市交通建设集团网站什么是静态网页
  • 做产品网站多少钱东莞教育网官网
  • 高端网站建设上海济南公共资源交易中心
  • 一个人做网站设计兼职百度最新版app下载安装
  • 网站管理员权限设置权限设置网站开发是分为前端和后端吗
  • 铜陵app网站做招聘信息网站建设合同 协议书
  • 成都网站建设销售落地页模板
  • 广州冼村地铁站几号线系统门窗品牌排行前十名
  • 北京论坛建站模板东莞营销型网站建设费用
  • 上海网站建设公司推建设部网站监理资质换证
  • 济南市城市建设集团网站沈阳祥云男科
  • 网站如何做服务器授权书马鞍山建设工程监督站网站
  • 哪里可以学做网站邢台123信息最新招聘信息
  • 网站怎么做才能将名声打响网址备案号查询
  • 做网站不想用微软雅黑了=> wordpress 翻译 不显示
  • 网站做招聘需要什么资质网站首页浮动窗口代码
  • 松江营销型网站建设怎么给产品做网络推广
  • 国外旅游网站排名网页设计心得体会2000字
  • wordpress网站被黑了龙之向导外贸经理人网站
  • 开网站做销售网址大全你懂的
  • 丰台网站建设推广seo营销推广平台