以下是摘自网络上的一个回帖,讲解的很简单,但易理解
FD_ZERO,FD_ISSET这些都是套节字结合操作宏
看看MSDN上的select函数,
这是在select io 模型中的核心,用来管理套节字IO的,避免出现无辜锁定.
int select( int nfds,fd_set FAR *readfds, fd_set FAR *writefds,
fd_set FAR *exceptfds,
const struct timeval FAR *timeout
);
第一个参数不管,是兼容目的,最后的是超时标准,select是阻塞操作
当然要设置超时事件.
接着的三个类型为fd_set的参数分别是用于检查套节字的可读性,可写性,和列外数据性质.
我举个例子
比如recv(), 在没有数据到来调用它的时候,你的线程将被阻塞
如果数据一直不来,你的线程就要阻塞很久.这样显然不好.
所以采用select来查看套节字是否可读(也就是是否有数据读了)
步骤如下
socket s;
.....
fd_set set;
while(1)
{
FD_ZERO(&set);//将你的套节字集合清空
FD_SET(s, &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字s
select(0,&set,NULL,NULL,NULL);//检查套节字是否可读,
//很多情况下就是是否有数据(注意,只是说很多情况)
//这里select是否出错没有写
if(FD_ISSET(s, &set) //检查s是否在这个集合里面,
{ //select将更新这个集合,把其中不可读的套节字去掉
//只保留符合条件的套节字在这个集合里面
recv(s,...);
}
//do something here
}
结合着MSDN查看了一下select函数,其实select函数的作用就是来获取一个或多个socket的状态(可读、可写、出错)。
select函数的原型是这样的
int select(
int nfds,
fd_set FAR *readfds,
fd_set FAR *writefds,
fd_set FAR *exceptfds,
const struct timeval FAR *timeout
);
调用select函数后,readfds中存放的便是可读的socket,可以使用FD_ISSET()检查指定的socket是否在readfds中(即是否可读)
同理writefds与exceptfds类似~
分享到:
相关推荐
易语言Socket编程之Select模型源码,Socket编程之Select模型,CreateSocket,FD_CLR,FD_ISSET,FD_SET,FD_ZERO,ThreadAcceptProc,ThreadProc,GetClientInfo,htonl,ntohl,ntohs,htons,WSAStartup,WSACleanup,closesocket,...
网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、recvfrom等。
windows
Windows Socket编程
Select()系统调用及 文件描述符集fd_set的应用.rar
Java源码:Socket编程
Socket_riverbu2_c#winformtcp_socket_socket编程_源码.rar
my_socket是将文件从windows传输到linux,my_socket_verify是将linux下的文件传到windows(因为我只写了单向的,verify只是做了一个验证而已)
linux 下的SOCKET编程相关的原理,对于初学网络编程者有帮助
socket编程示例;有server 和 client两种模式;包含全部源码,是vc++ socket编程的范例
windows_socket_api_函数大全
这是小例子是我自学Socket编程的时候写的,没有太大的扩展性,因为里面用的分隔符我一直没有想到太好的,所以用,号分割了,聊天的时候不能发,号 要么会出错,大家可以下载之后自己改,我觉得还算能用!很久没有发表...
使用socket进行网络编程,是一个小demo的实现,方便初学者入门,很简单。
Windows_Socket_网络编程Windows_Socket_网络编程Windows_Socket_网络编程
socket网络编程实例代码分为服务端和客户端,client是客户端的文件。server是服务端的文件。可以作为参考
java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程java_socket编程
WinSocket 编程资料..Word文档
unix_socket_socket编程_Unix域套接字_udpclient_tunedaa_网络编程_源码.zip
unix_socket_socket编程_Unix域套接字_udpclient_tunedaa_网络编程_源码.rar