WEB开发网
开发学院软件开发VC WinSock学习笔记(2) 阅读

WinSock学习笔记(2)

 2010-05-25 20:36:41 来源:WEB开发网   
核心提示:2、select模型:通过调用select函数可以确定一个或多个套接字的状态,判断套接字上是否有数据,WinSock学习笔记(2)(3),或者能否向一个套接字写入数据,intselect( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR

2、select模型:

通过调用select函数可以确定一个或多个套接字的状态,判断套接字上是否有数据,或

者能否向一个套接字写入数据。

int select( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, 
fd_set FAR *exceptfds, const struct timeval FAR * timeout );

◆先来看看涉及到的结构的定义:

a、 d_set结构:

#define FD_SETSIZE 64?
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;

fd_count为已设定socket的数量

fd_array为socket列表,FD_SETSIZE为最大socket数量,建议不小于64。这是微软建

议的。

B、timeval结构:

struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};

tv_sec为时间的秒值。

tv_usec为时间的毫秒值。

这个结构主要是设置select()函数的等待值,如果将该结构设置为(0,0),则select()函数

会立即返回。

◆再来看看select函数各参数的作用:

nfds:没有任何用处,主要用来进行系统兼容用,一般设置为0。

readfds:等待可读性检查的套接字组。

writefds;等待可写性检查的套接字组。

exceptfds:等待错误检查的套接字组。

timeout:超时时间。

函数失败的返回值:调用失败返回SOCKET_ERROR,超时返回0。

readfds、writefds、exceptfds三个变量至少有一个不为空,同时这个不为空的套接字组

种至少有一个socket,道理很简单,否则要select干什么呢。举例:测试一个套接字是否可读:

fd_set fdread;
//FD_ZERO定义
// #define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0)
FD_ZERO(&fdread);
FD_SET(s,&fdread); //加入套接字,详细定义请看winsock2.h
if(select(0,%fdread,NULL,NULL,NULL)>0
{
  //成功
  if(FD_ISSET(s,&fread) //是否存在fread中,详细定义请看winsock2.h
  {
    //是可读的
  }
}

上一页  1 2 3 4 5  下一页

Tags:WinSock 学习 笔记

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接