当前位置: 技术问答>linux和unix
select()函数(新手请教)
来源: 互联网 发布时间:2016-07-13
本文导语: int select(int n, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout); readfds即为我们监听的要进行读操作的套接字连接,第三个参数是我们监听的要进行写操作的套接字连接,第四个参数用于异常,而最...
int select(int n, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);
readfds即为我们监听的要进行读操作的套接字连接,第三个参数是我们监听的要进行写操作的套接字连接,第四个参数用于异常,而最后一个参数可以用来设定超时.
如果在一个套接字中,既有读操作,又有写操作,该怎么设置参数??
readfds即为我们监听的要进行读操作的套接字连接,第三个参数是我们监听的要进行写操作的套接字连接,第四个参数用于异常,而最后一个参数可以用来设定超时.
如果在一个套接字中,既有读操作,又有写操作,该怎么设置参数??
|
把读的文件描述符加入writefds集合,写的文件描述符加入readfds集合就可以了
或者还可以用poll函数
或者还可以用poll函数
|
//假设描述符fd
fd_set writefds;
fd_set readfds;
fd_set errfds;
struct timeval tv;
int ret;
FD_ZERO(&writefds);
FD_SET(fd, &writefds);
FD_ZERO(&errfds);
FD_SET(fd, &errfds);
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
ret = select(fds+1, &readfds, &writefds, &errfds);
if(ret != -1)
{
if (FD_ISSET(fd, &errfds))
{
*len = 0;
return -2;
}
else if(FD_ISSET(fd, &readfds)
{
//可读
}
else if(FD_ISSET(fd, &writefds)
{
//可写
}
}
else
{
//error
}
fd_set writefds;
fd_set readfds;
fd_set errfds;
struct timeval tv;
int ret;
FD_ZERO(&writefds);
FD_SET(fd, &writefds);
FD_ZERO(&errfds);
FD_SET(fd, &errfds);
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
ret = select(fds+1, &readfds, &writefds, &errfds);
if(ret != -1)
{
if (FD_ISSET(fd, &errfds))
{
*len = 0;
return -2;
}
else if(FD_ISSET(fd, &readfds)
{
//可读
}
else if(FD_ISSET(fd, &writefds)
{
//可写
}
}
else
{
//error
}
|
你把读的加入writefds文件符集,写的加入readfds就可以了啊。
|
如果你对这些文件描述符集不感兴趣,也就是都设置为null。那么select就可以用来当做一个更加精确的定时器来使用了。
|
同时把这个套接字描述符在readfds, writefds中都设置下,这样一但可写或者可读就可以获知。