2016-06-27 52 views
1

我的Linux UDP插座这样的代码:Linux UDP套接字:select()没有通知?

//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客户端发送。

但如果我select()后把recvfrom,见下面的代码,select()不会返回,当我从ncat客户端发送数据到这个插座。

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); 
    } 
} 
+0

这是'C'或'C++',我想'C'但我宁愿不承担。 –

+1

您需要每次在循环中恢复read_ste。 – EJP

回答

0
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); 
} 
}