



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
选择(select)模型是Winsock中最常见的 I/O模型。核心便是利用 select 函数,实现对 I/O的管理!利用 select 函数来判断某Socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在Socket处于阻塞模式中时,在一次 I/O 调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。select函数原型:intselect( intnfds, /传入参数,忽略 fd_set FAR *readfds, /检查可读性 fd_set FAR *writefds, /检查可写性 fd_set FAR * exceptfds, /例外数据 conststructtimeval FAR *timeout /本次select调用最长的等待时间);函数返回值,select()函数调用后,返回处于就绪状态并且已经包含在fd_set结构中的套接口描述符,也就是说,它要修改集合,删除那些不能进行指定操作的套接口。但如果超时则返回0;如果发生错误,则返回SOCKET_ERROR,应用程序可通过WSAGetLastError()获取错误代码。其中fd_set是一个结构类型说明符,代表着一系列特定套接口的集合,它的定义如下:typedefstructfd_set u_int fd_count; /* how many are SET? */ SOCKETfd_array FD_SETSIZE; /* an array of SOCKETs */fd_set;timeval是一个结构类型,它的定义如下:structtimeval long tv_sec; /* seconds */ long tv_usec; /* and microseconds */;若将超时值设置为(0 , 0),表明 select 会立即返回,出于对性能方面的考虑,应避免这样的设置。以下为测试select()函数的程序,一个服务器端两个客户端下面是服务器端程序:#defineFD_SETSIZE 500#include#pragmacomment ( lib, ws2_32 )#includeintmain() printf( 服务器端程序.n ); /-加载- WSADATA wsaData; if( WSAStartup( MAKEWORD( 2 ,2 ),& wsaData)!= 0 ) printf( WSAStartup Failed,Error=【%d】n , WSAGetLastError(); return1 ; else printf( 加载成功n ); /-创建流式套接字- SOCKET s= socket( AF_INET, SOCK_STREAM, 0 ); if( s= INVALID_SOCKET) printf( socket() Failed,Error=【%d】n , WSAGetLastError(); return1 ; else printf( 已创建监听套接口:【%d】n , s); /将套接口s置于”非阻塞模式“ u_long u1= 1 ; ioctlsocket( s, FIONBIO,( u_long*)& u1); /-绑定本地地址- structsockaddr_in Sadd; Sadd.sin_family= AF_INET; Sadd.sin_port= htons( 5555 ); Sadd.sin_addr.S_un.S_addr= inet_addr( 192.168.31.1 ); if( bind( s,( sockaddr*)& Sadd, sizeof ( Sadd)= SOCKET_ERROR) printf( bind() Failed,Error=【%d】n , WSAGetLastError(); return1 ; else printf( 绑定成功,本地IP地址:【%s】,端口号:【%d】n , inet_ntoa( Sadd.sin_addr), ntohs( Sadd.sin_port); /-进入监听状态- if( listen( s, 3 )= SOCKET_ERROR) printf( listen Failed,Error=【%d】n , WSAGetLastError(); return1 ; else printf( 进入监听状态n ); /-select- /准备工作 intx= 1 ; timeval tv; tv.tv_sec= 20 ; tv.tv_usec= 0 ; fd_set socket_jh01; FD_ZERO(& socket_jh01); FD_SET( s,& socket_jh01); fd_set socket_jh02; FD_ZERO(& socket_jh02); while( TRUE ) socket_jh02= socket_jh01; intsock_sum= select( 0 ,& socket_jh02, NULL , NULL ,& tv); /-情况一成功 if( sock_sum 0 ) for( inti= 0 ;i( int ) socket_jh02.fd_count; i+) if( socket_jh02.fd_array i= s) if( socket_jh01.fd_count 0 ) printf( 接收到来至【%d】的数据:%sn , socket_jh02.fd_array i, cbuf); intisend; charSbuf= Hello client!I am server ; isend= send( socket_jh02.fd_array i, Sbuf, sizeof ( Sbuf), 0 ); if( isend= SOCKET_ERROR) printf( send() Failed,Error=【%d】n , WSAGetLastError(); break ; elseif( isend= 0 ) printf( 消息发送失败!n ); break ; else printf( 给客户【%d】信息已发送,信息长度%d字节nn , socket_jh02.fd_array i, isend); else printf( 客户端【%d】不再发送数据,正常关闭连接,为客户端连接创建的套接口将关闭!n , socket_jh02.fd_array i); closesocket( socket_jh02.fd_array i); FD_CLR( socket_jh02.fd_array i,& socket_jh01); /end for /end sock_sum /-情况二超时 elseif( sock_sum= 0 ) printf( 第【%d】次超时n , x); if( x 3 ) x+; continue ; else printf( 超过等待限制,退出程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国油压钻床行业投资前景及策略咨询研究报告
- 2025年中国橡胶边纸盆行业市场调查、投资前景及策略咨询报告
- 2025年中国整烫设备配件行业市场调查、投资前景及策略咨询报告
- 2025年中国扣式电池专用NI(OH)2行业市场调查、投资前景及策略咨询报告
- 完善中小学教育管理制度
- 对干部档案日常管理制度
- 三公司职工食堂管理制度
- 公司消防队库室管理制度
- 幼儿园教学常规管理制度
- 施工项目设备管理制度
- 青岛海明城市发展有限公司及全资子公司招聘笔试真题2022
- 浙江省杭州市2024届数学四下期末考试试题含解析
- 北京市首都师范大学附属回龙观育新学校2025届数学高一下期末统考试题含解析
- 2024年高考物理热点磁场中的旋转圆、放缩圆、平移圆、磁聚焦模型(学生版)
- 三年级下册语文单元字词专项练习-第1单元
- 鸟巢建筑分析
- 联合体施工组织设计审批流程
- 中华民族共同体概论课件专家版10第十讲 中外会通与中华民族巩固壮大(明朝时期)
- 2021年10月自考02326操作系统试题及答案含解析
- 中华民族共同体概论课件专家版5第五讲 大一统与中华民族共同体初步形成(秦汉时期)
- MOOC 大数据与法律检索-湖南师范大学 中国大学慕课答案
评论
0/150
提交评论