2016-06-27 12 views
1

私はこのようなLinuxのUDPソケットコードがあります:recvfrom、ここに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); 

は正常に動作し、上記printfは私がncatクライアントから送信するものを出力しますすることができます。

しかし、私はselect()recvfromを入れた場合、以下のコードを参照してください、私はこのソケットに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); 
    } 
} 
+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); 
} 
} 
関連する問題