关于如何在TCP中使用select()的困惑

时间:2015-02-03 04:52:30

标签: sockets tcp server system-calls

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);

readfds& writefds - 他们可以同时使用吗? EX:如果我有一个接一个的读操作和发送操作

此外,任何人都可以提供良好的链接或示例程序吗?

select(...)仅用于服务器程序吗?或仅在TCP?

1 个答案:

答案 0 :(得分:0)

来自manual

  

观看三组独立的文件描述符。列出的那些   在readfds中将观察是否可以使用字符   阅读(更确切地说,看看阅读是否会阻止;在...中   特别是,文件描述符也准备在文件结尾),那些在   将观察writefds以查看写入是否会阻塞,以及那些   在exceptfds中将监视异常。退出时,套装是   修改到位以指示实际更改了哪些文件描述符   状态。可以将三个文件描述符集中的每一个指定为   如果没有要查看相应的文件描述符,则为NULL   一类事件。

提供readfds的小例子:

fd_set set;

FD_SET(0,&set); //stdin
FD_SET(socket,&set); //socket may be your tcp-fd where you wanna read from

while(1) {

select(socket,&set,NULL,NULL,NULL) 

FD_ZERO(&set);
FD_SET(0,&set);
FD_SET(socket,&set);

if(FD_ISSET(0,&set)) 
{
 //write the input on the stream
}

if(FD_ISSET(socket,&set)) 
{
 //read any content from the stream

}
}

只需声明一组writefds,并使用FD_ISSET检查其状态,它应该 simuntanouesly

Select()可以在任何想要处理多个描述符的地方使用。