我知道只要注册的套接字缓冲区中有数据,就会触发select()
。
如果这两个陈述之间存在延迟,会发生什么。
FD_SET(listener, &read_fds); // &
(select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1)
如果数据包到达这两个语句之间会发生什么?
//create socket and listen for packets &
FD_SET(listener, &read_fds);
假设在触发选择后recv()
完成。
select()
通话之前到达,会发生什么情况
制作。? FD_ISSET
是否仍然检测到已经存在的数据包
套接字缓冲区或仅在新数据包到达时才会被检测到
选择被触发了吗?// add the listener to the master set
FD_SET(listener, &master);
// keep track of the biggest file descriptor
fdmax = listener; // so far, it's this one
// main loop
for(;;) {
read_fds = master; // copy it
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(4);
}
// run through the existing connections looking for data to read
for(i = 0; i <= fdmax; i++) {
if (FD_ISSET(i, &read_fds)) { // we got one!!
答案 0 :(得分:2)
了解套接字创建与
select()
系统调用之间的差距
在您的问题中,套接字创建与select()
之间没有差距。
我知道只要注册的套接字缓冲区中有数据,就会触发select()。
对于读取事件是正确的,它适用于连接套接字的套接字 receive 缓冲区。如果侦听套接字上有入站连接,或者发送事件的套接字发送缓冲区中有空间,也会触发。
如果这两个陈述之间存在延迟,会发生什么。
FD_SET(listener, &read_fds); // &
(select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1)
没什么不好的。它们之间发生的任何事件仍将发出信号。但是第一个声明不是套接字创建,与你的标题相反。
如果数据包到达这两个语句之间会发生什么?
//create socket and listen for packets &
FD_SET(listener, &read_fds);
套接字发送缓冲区从创建套接字的那一刻起就存在,因此数据将进入缓冲区,因此当select()
运行时,它将看到并触发读取事件。
假设在触发select时完成recv()。 如果数据包在进行select()调用之前到达会发生什么。?
套接字发送缓冲区从创建套接字的那一刻起就存在,因此数据将进入缓冲区,因此当select()
运行时,它将看到并触发读取事件。
FD_ISSET是否仍然检测到已经在套接字缓冲区中的数据包
是
或仅在新数据包到达且选择被触发时才会被检测到?
始终会被检测到。
答案 1 :(得分:1)
如果等待读取数据,select
将立即返回,FD_ISSET
将对数据到达的文件描述符返回true。如果数据在调用select
之前或之后到达,则无关紧要。
答案 2 :(得分:1)
select()
立即完成;否则它将阻塞,直到一个或多个观察条件变为活动状态(或超时,如果指定,则到期)。