【问题标题】:Linux UDP socket: select() is not notified?Linux UDP 套接字:select() 没有得到通知?
【发布时间】:2016-06-27 21:56:38
【问题描述】:

我有这样的 Linux UDP 套接字代码:

//create the UDP socket and bind to a local port 5001
//sockfd = socket(AF_INET, UDP, 0);
//bind(sockfd, .., ...);
recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&remote_addr, &addrlen);
printf("%s\n", buffer);  

到这里,recvfrom 工作正常,上面的printf 可以打印我从ncat 客户端发送的内容。

但是如果我将recvfrom 放在select() 之后,请参见下面的代码,当我将数据从ncat 客户端发送到此套接字时,select() 将不会返回。

max_fd = 0
FD_ZERO(&read_set);
FD_SET(sockfd, &read_set);

while (1) {
    i = select(max_fd + 1, &read_set, NULL, NULL, NULL);  //==> !!! select() is not returned from ncat sent data to this socket
    if (i < 0 && errno != EINTR) { 
         .............
    }
    for (current_fd = 0; current_fd <= max_fd; current_fd++){
        if ( !FD_ISSET(current_fd, &read_set) )
                continue;
         nbytes = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&remote_addr, &addrlen);
         printf("%d bytes received \n", nbytes );
    }
}

【问题讨论】:

  • 这是C 还是C++,我在想C 但我不想假设。
  • 您需要在每次循环时恢复 read_ste。

标签: linux sockets udp


【解决方案1】:
while (1) {
 FD_ZERO(&read_set);
 FD_SET(sockfd, &read_set);
 i = select(max_fd + 1, &read_set, NULL, NULL, NULL);  
if (i < 0 && errno != EINTR) { 
     .............
}
for (current_fd = 0; current_fd <= max_fd; current_fd++){
    if ( !FD_ISSET(current_fd, &read_set) )
            continue;
     nbytes = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr    *)&remote_addr, &addrlen);
     printf("%d bytes received \n", nbytes );
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多