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

茂名市网站建设_网站建设公司_VS Code_seo优化

太原手机微网站建设,wordpress登陆页面美化,三合一网站什么意思,网站有很多304状态码前言#xff1a; 在很多比较各种网络模型的文章中#xff0c;但凡提到select模型时#xff0c;都会说select受限于轮询的套接字数量#xff0c;这个 数量也就是系统头文件中定义的FD_SETSIZE值(例如64)。但事实上这个算不上真的限制。 C语言的偏方#xff1a; 在C语…前言 在很多比较各种网络模型的文章中但凡提到select模型时都会说select受限于轮询的套接字数量这个 数量也就是系统头文件中定义的FD_SETSIZE值(例如64)。但事实上这个算不上真的限制。 C语言的偏方 在C语言的世界里存在一个关于结构体的偏门技巧例如 typedef struct _str_type {     int _len;     char _s[1]; }str_type; str_type用于保存字符串(我只是举例事实上这个结构体没什么用处)乍看上去str_type只能保存长度为 1的字符串(\0)。但是通过写下如下的代码你将突破这个限制 int str_len  5; str_type *s (str_type*) malloc( sizeof( str_type ) str_len - 1 ); // free( s ); 这个技巧原理很简单因为_s恰好在结构体尾部所以可以为其分配一段连续的空间只要注意指针的使用 这个就算不上代码上的罪恶。但是这个技巧有个限制str_type定义的变量必须是被分配在堆上否则会破 坏堆栈。另外需要动态增长的成员需要位于结构体的末尾。最后一个忠告就是这个是C语言里的技巧 如果你的结构体包含了C的东西这个技巧将不再安全(Inside the C object model)。 其实select也可以这样做 事实上因为select涉及到的fd_set是一个完全满足上述要求的结构体 winsock2.h : typedef struct fd_set {         u_int fd_count;               /* how many are SET? */         SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */ } fd_set; 但是如果使用了以上技巧来增加fd_array的数量(也就是保存的套接字数量)那么关于fd_set的那些宏可 能就无法使用了例如FD_SET。 winsock2.h : #define FD_SET(fd, set) do { \     u_int __i; \     for (__i  0; __i ((fd_set FAR *)(set))-fd_count; __i) { \         if (((fd_set FAR *)(set))-fd_array[__i] (fd)) { \             break; \         } \     } \     if (__i ((fd_set FAR *)(set))-fd_count) { \         if (((fd_set FAR *)(set))-fd_count FD_SETSIZE) { \             ((fd_set FAR *)(set))-fd_array[__i] (fd); \             ((fd_set FAR *)(set))-fd_count; \         } \     } \ } while(0) 有点让人眼花缭乱我鼓励你仔细看其实很简单。这里有个小技巧就是他把这些代码放到一个do...while(0) 里为什么要这样做我觉得应该是防止名字污染也就是防止那个__i变量与你的代码相冲突。可以看出 FD_SET会将fd_count与FD_SETSIZE相比较这里主要是防止往fd_array的非法位置写数据。 因为这个宏原理不过如此所以我们完全可以自己写一个新的版本。例如 #define MY_FD_SET( fd, set, size ) do { \     unsigned int i  0; \     for( i  0; i ((fd_set*) set)-fd_count; i ) { \         if( ((fd_set*)set)-fd_array[i] (fd) ) { \             break; \         } \     } \     if( i ((fd_set*)set)-fd_count ) { \         if( ((fd_set*)set)-fd_count (size) ) { \             ((fd_set*)set)-fd_array[i] (fd); \             ((fd_set*)set)-fd_count ; \         } \     } \ } while( 0 ) 没什么变化只是为FD_SET加入一个fd_array的长度参数宏体也只是将FD_SETSIZE换成这个长度参数。 于是现在你可以写下这样的代码 unsigned int count  100; fd_set *read_set (fd_set*) malloc( sizeof( fd_set )  sizeof(SOCKET) * (count - FD_SETSIZE ) ); SOCKET s socket( AF_INET, SOCK_STREAM, 0 ); // MY_FD_SET( s, read_set, count ); // free( read_set ); closesocket( s ); 小提下select模型 这里我不会具体讲select模型我只稍微提一下。一个典型的select轮询模型为 int r select( 0, read_set, 0, 0, timeout ); if( r  0 ) {     // select error }  if( r  0 ) {     for( each sockets )     {         if( FD_ISSET( now_socket, read_set ) )         {             // this socket can read data         }     } }  轮询write时也差不多。在Etwork(一个超小型的基本用于练习网络编程的网络库,google yourself)中作者 的轮询方式则有所不同 //read_set, write_set为采用了上文所述技巧的fd_set类型的指针intr select( 0 , read_set, write_set, 0 , timeout ); //error handlingfor ( inti 0 ; i read_set - fd_count; i ) {     // 轮询所有socket这里直接采用read_set-fd_array[i] now_socket判断而不是FD_ISSET }for ( inti 0 ; i write_set - fd_count; i ) {     // 轮询所有socket检查其whether can write判断方式同上 }
http://www.ihoyoo.com/news/26793.html

相关文章:

  • 企业网站例子网络游戏免费加盟代理
  • 江苏缘生源建设工程有限公司网站一元购网站的建设
  • 做电商哪几个设计网站比较好产品设计培训
  • 百度右边相关网站怎么做的厦门谷歌推广
  • 网站哪里有网络营销方式类型有哪些
  • app开发必须要网站吗怎么做企业网站推广的方法
  • 微信网站开发有中院管辖呢建设公司网站价格
  • 网站优化关键词排名怎么做wordpress code theme
  • 网站做等保备案升级wordpress 另一更新正在进行
  • 泰州建设局网站织梦cms如何搭建网站
  • 网站设计联系视频网站X站H站搭建建设
  • 移动网站的开发流程局域网网站怎样做数据库
  • 织梦网站模板源码php手机app应用开发
  • 课程注册 网站开发如何备份wordpress数据库
  • 深圳网站优化服务做网站微信朋友圈应该怎么发
  • 网站建设 视频教程扬州市住房建设局网站
  • 巴州建设局网站网站推广的效果好
  • 做网站有多难上海专业网站建设报价单
  • 福清市建设局网站多少物联网平台源码
  • 网站开发方案书博客网站建设一流公司
  • 合肥网站优化价格西部数码网站管理控制面板
  • 广州网捷网站建设技术有限公司wordpress 文章 页面
  • 网站建设合作协议文本简单网页代码html作业
  • 手机号网站源码网站制作1
  • 鼓楼微网站开发建设公共网站的手续
  • 科技网站内容设计用360云盘做网站
  • 报网站开发培训班网站建设考题
  • 找室内效果图的网站txt免费全本电子书软件下载网站
  • 成品网站w灬 源码1688网页精准拓客营销系统
  • 绵阳网站建设 小程序徐州建设网站公司