今天上午使用select函数,狠查了一番,又实践了windows和vxworks两种操作系统,函数的使用是一样的。现在记下以备注,以后可能还要修改。
首先,查看函数原型:
int select
(
int width, /* number of bits to examine from 0 */
fd_set * pReadFds, /* read fds */
fd_set * pWriteFds, /* write fds */
fd_set * pExceptFds, /* exception fds (unsupported) */
struct timeval * pTimeOut /* max time to wait, NULL = forever */
)
width,即是socket的最大值+1,其最大限2048,fd_set是一个256的数组,每一位表示一个socket,256*8=2048
pTimeOut:函数调用的超时时间
在我们调用select函数之前,有两个宏必须调用:
fd_set readfds;
FD_ZERO(&readfds);//clear
FD_SET(fd,&readfds);//关注readfds中fd位置上的值
在select函数成功后,select(x.tcplistenfd+1,&readfds,&wrtfds,NULL,&tv);
调用
FD_ISSET(fd,&readfds);如果成功说明fd上可读
FD_ISSET(fd,& wrtfds);如果成功说明fd上可写要记住以下代码是一个整体:{fd_set readfds;FD_ZERO(&readfds);//clearFD_SET(fd,&readfds);//关注readfds中fd位置上的值FD_ZERO(&wrtfds); FD_SET(x.tcplistenfd,&wrtfds);select(x.tcplistenfd+1,&readfds,&wrtfds,NULL,&tv);}
每一次select之前都必须初始化,因为在select后,会清楚你所关注的位,必须重新置上。
否则的话,在调用第二次时会产生错误号10028(windows中)。
先写到这,这两天准备写一下windows,vxworks的TCP函数。写完了再写上来。