【问题标题】:Confusion on how to use select() in TCP关于如何在 TCP 中使用 select() 的困惑
【发布时间】:2015-04-02 05:12:48
【问题描述】:

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

readfds & writefds - 它们可以同时使用吗?例如:如果我一个接一个地进行读取操作和发送操作

另外,谁能提供一个好的链接或示例程序?

select(...) 是否仅用于服务器程序?还是只在 TCP 中?

【问题讨论】:

  • 我不明白“同时”。如果这就是您的意思,您可以同时在套接字上选择可读性和可写性,但您不需要等待可写性来写任何东西。您应该只写,并使用 select 的可写性部分来处理 send() 返回 -1 和 errno = EAGAIN/EWOULDBLOCK. 的偶尔情况
  • 这就是我想知道的。我尝试在我的程序中使用它,但没有得到想要的程序。然后我浏览了网上的一些程序,其中一些字段设置为 NULL。所以我开始想知道是否必须为接收和发送操作分别调用 select(),其他字段设置为 NULL,即 writefds 用于发送,readfds 用于接收
  • 另外,我还有一个问题,在这个站点cse.sc.edu/~wyxu/515Fall08/slides/select.pdf 上,有人提到 select() 将提供以下功能:当集合 {1,4,5} 中的任何描述符时返回准备好读取 集合 {2,7} 中的任何描述符都准备好写入 集合 {1,4} 中的任何描述符都有一个异常条件未决。
  • 这意味着什么?从某种意义上说,这个集合代表什么?如果是一组描述符,那么数字是如何分配的?如果没有怎么办。描述符小于 7? .摘自第三张纸的第五张幻灯片

标签: sockets tcp server system-calls


【解决方案1】:

来自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 检查它们的状态,它应该可以同时运行

Select() 可用于您想处理多个描述符的任何地方。

【讨论】:

  • 谢谢,对于延迟回复我深表歉意。它确实清除了一些重大问题的阴云。然而,我有一个悬而未决的疑问。您能否发布一个指向 sn-p 的链接,该链接显示它如何处理多个 readfds 和 writefds,这将进一步说明您对 select() 如何在集合 {1,4,5} ,{2 中分配和使用多个文件描述符的观点,7} 和 {1,4}
猜你喜欢
  • 2015-10-16
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2015-11-28
  • 2019-05-17
  • 2020-03-06
相关资源
最近更新 更多