欢迎来到天天文库
浏览记录
ID:17000986
大小:35.00 KB
页数:5页
时间:2018-08-26
《socket通信接口的模式选择》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Socket通信接口的模式选择选择(select)模型是Winsock中最常见的I/O模型。核心便是利用select函数,实现对I/O的管理!利用select函数来判断某Socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在Socket处于阻塞模式中时,在一次I/O调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。select函数原型:int select( int nfds, //传入参数,忽略 fd_setFAR* readfds,
2、//检查可读性 fd_setFAR* writefds, //检查可写性 fd_setFAR*exceptfds, //例外数据 const struct timevalFAR* timeout//本次select调用最长的等待时间);函数返回值,select()函数调用后,返回处于就绪状态并且已经包含在fd_set结构中的套接口描述符,也就是说,它要修改集合,删除那些不能进行指定操作的套接口。但如果超时则返回0;如果发生错误,则返回SOCKET_ERROR,应用程序可通过WSAGetLastError()获取错误代码。其中fd_set是一个结构
3、类型说明符,代表着一系列特定套接口的集合,它的定义如下:typedef struct fd_set{ u_intfd_count; /*howmanyareSET?*/ SOCKET fd_array[FD_SETSIZE]; /*anarrayofSOCKETs*/} fd_set;timeval是一个结构类型,它的定义如下:struct timeval{ long tv_sec; /*seconds*/ long tv_usec; /*andmicrosecond
4、s*/};若将超时值设置为(0,0),表明select会立即返回,出于对性能方面的考虑,应避免这样的设置。以下为测试select()函数的程序,一个服务器端两个客户端下面是服务器端程序:otherstaffoftheCentre.Duringthewar,ZhuwastransferredbacktoJiangxi,andDirectorofthenewOfficeinJingdezhen,JiangxiCommitteeSecretary.Startingin1939servedasrecorderoftheWestNorthOrganization,Secreta
5、ryoftheSpecialCommitteeAfterthevictoryofthelongMarch,hehasbeentheNorthwestOfficeoftheFederationofStateenterprisesMinister,ShenmufuguSARmissions,DirectorofNingxiaCountypartyCommitteeSecretaryandrecorderoftheCountypartyCommitteeSecretary,Ministersand#define FD_SETSIZE500#include 6、K2.H>#pragma comment(lib,"ws2_32")#include int main(){ printf("服务器端程序...."); //------①加载---------- WSADATAwsaData; if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartupFailed,Error=【%d】",WSAGetLastError()); return 1; } else printf("①加载成功7、"); //-------②创建流式套接字------------ SOCKETs=socket(AF_INET,SOCK_STREAM,0); if (s==INVALID_SOCKET) { printf("socket()Failed,Error=【%d】",WSAGetLastError()); return 1; } else printf("②已创建监听套接口:【%d】",s); //将套接口s置于”非阻塞模式“ u_longu1=1; ioctlsocket(s,FIONB
6、K2.H>#pragma comment(lib,"ws2_32")#include int main(){ printf("服务器端程序...."); //------①加载---------- WSADATAwsaData; if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartupFailed,Error=【%d】",WSAGetLastError()); return 1; } else printf("①加载成功
7、"); //-------②创建流式套接字------------ SOCKETs=socket(AF_INET,SOCK_STREAM,0); if (s==INVALID_SOCKET) { printf("socket()Failed,Error=【%d】",WSAGetLastError()); return 1; } else printf("②已创建监听套接口:【%d】",s); //将套接口s置于”非阻塞模式“ u_longu1=1; ioctlsocket(s,FIONB
此文档下载收益归作者所有