Socket通信接口模式选择.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Socket通信接口模式选择

Socket通信接口的模式选择 选择(select)模型是Winsock中最常见的 I/O模型。核心便是利用 select 函数,实现对 I/O的管理!利用 select 函数来判断某Socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在Socket处于阻塞模式中时,在一次 I/O 调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。 select函数原型: int??select( ? ? int??nfds,? ?//传入参数,忽略 ? ? fd_set FAR *??readfds,? ???//检查可读性 ? ? fd_set FAR *??writefds,? ? //检查可写性 ? ? fd_set FAR * exceptfds,? ???//例外数据 ? ? const??struct??timeval FAR *??timeout //本次select调用最长的等待时间 ); 函数返回值,select()函数调用后,返回处于就绪状态并且已经包含在fd_set结构中的套接口描述符,也就是说,它要修改集合,删除那些不能进行指定操作的套接口。但如果超时则返回0;如果发生错误,则返回SOCKET_ERROR,应用程序可通过WSAGetLastError()获取错误代码。 其中fd_set是一个结构类型说明符,代表着一系列特定套接口的集合,它的定义如下: typedef??struct??fd_set { ? ?? ???u_int fd_count;? ?? ?? ?? ?? ? /* how many are SET? */ ? ?? ???SOCKET??fd_array[ FD_SETSIZE];? ? /* an array of SOCKETs */ }??fd_set; timeval是一个结构类型,它的定义如下: struct??timeval { ? ?? ???long? ???tv_sec;? ?? ?? ? /* seconds */ ? ?? ???long? ???tv_usec;? ?? ?? ?/* and microseconds */ }; 若将超时值设置为(0 , 0),表明 select 会立即返回,出于对性能方面的考虑,应避免这样的设置。 以下为测试select()函数的程序,一个服务器端两个客户端 下面是服务器端程序: #define??FD_SETSIZE 500 #include?? WINSOCK2.H #pragma??comment ( lib, ws2_32 ) #include?? stdio.h int??main() { ? ? printf( 服务器端程序....\n ); ? ? //------①加载---------- ? ? WSADATA wsaData; ? ? if??( WSAStartup( MAKEWORD( 2 ,2 ), wsaData)!= 0 ) ? ? { ? ?? ???printf( WSAStartup Failed,Error=【%d】\n , WSAGetLastError()); ? ?? ???return??1 ; ? ? } ? ? else ? ?? ???printf( ①加载成功\n ); ? ? //-------②创建流式套接字------------ ? ? SOCKET s= socket( AF_INET, SOCK_STREAM, 0 ); ? ? if??( s== INVALID_SOCKET) ? ? { ? ?? ???printf( socket() Failed,Error=【%d】\n , WSAGetLastError()); ? ?? ???return??1 ; ? ? } ? ? else ? ?? ???printf( ②已创建监听套接口:【%d】\n , s); ? ? //将套接口s置于”非阻塞模式“ ? ? u_long u1= 1 ; ? ? ioctlsocket( s, FIONBIO,( u_long*) u1); ? ? //-----------③绑定本地地址--------------------- ? ? struct??sockaddr_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??( b

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档