理解套接字创建和select()系统调用之间的差距

时间:2015-09-21 23:57:22

标签: c sockets network-programming

我知道只要注册的套接字缓冲区中有数据,就会触发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!!

3 个答案:

答案 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()立即完成;否则它将阻塞,直到一个或多个观察条件变为活动状态(或超时,如果指定,则到期)。