- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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.hint??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)