1
...
/* Initialize the input set */
FD_ZERO(&input);
FD_SET(fd, &input);
FD_SET(sock, &input);

max_fd = (sock > fd ? sock : fd) + 1;

/* Do the select */
n = select(max_fd, &input, NULL, NULL, NULL);

/* See if there was an error */
if (n < 0)
  perror("select failed");
else if (n == 0)
  puts("TIMEOUT");
else
{
  /* We have input */
  if (FD_ISSET(fd, &input))
process_fd();
  if (FD_ISSET(sock, &input))
process_socket();
}

記述子の1つが準備できたらすぐに、このアプローチが終了しないのではないかと思います。
両方の記述子を読み取りたい場合はどうすればよいですか?

select(...)私はまだ、最初に処理する準備ができているものを把握するために使用したいと考えています。全体をループに入れてみましたが、永遠にブロックされます。


アップデート

  328     fd_set readfds; FD_ZERO(&readfds);
  329     int waiting = 2;
  330     while(waiting) {
  331 
  332       FD_SET(sockv4query, &readfds);
  333       FD_SET(sockv6query, &readfds);
  334 
  335       /* one greater than the highest fd number */
  336       int nfds = (sockv4query > sockv6query ? sockv4query : sockv6query) + 1;
  337 
  338       if (
  339          select(
  340                  nfds,         /* number of fds */
  341                  &readfds,     /* set of read fds */
  342                  NULL,         /* set of write fds */
  343                  NULL,         /* set of exception fds */
  344                  NULL          /* maximum wait interval */
  345                ) < 0
  346        ) {
  347         perror("select(...)");
  348         continue;
  349       } else {
  350 
  351         /* one or more descriptors is ready */
  352         if(FD_ISSET(sockv4query, &readfds)) {
  353           receive_response_and_echo(sockv4query);
  354           waiting -= 1;
  355         }
  356         if(FD_ISSET(sockv6query, &readfds)) {
  357           receive_response_and_echo(sockv6query);
  358           waiting -= 1;
  359         }
  360       }
  361     }
4

1 に答える 1

0

私は次のようなことをします。

      328     fd_set readfds; FD_ZERO(&readfds);
      329     int process_fd1 = 1,process_fd2 = 1;
      330     while(process_fd1 || process_fd2) {
      331 
      332       FD_SET(sockv4query, &readfds);
      333       FD_SET(sockv6query, &readfds);
      334 
      335       /* one greater than the highest fd number */
      336       int nfds = (sockv4query > sockv6query ? sockv4query : sockv6query) + 1;
      337 
      338       if (
      339          select(
      340                  nfds,         /* number of fds */
      341                  &readfds,     /* set of read fds */
      342                  NULL,         /* set of write fds */
      343                  NULL,         /* set of exception fds */
      344                  NULL          /* maximum wait interval */
      345                ) < 0
      346        ) {
      347         perror("select(...)");
      348         continue;
      349       } else {
      350 
      351         /* one or more descriptors is ready */
      352         if(FD_ISSET(sockv4query, &readfds)) {
      353           receive_response_and_echo(sockv4query);
      354           process_fd1 = 0;
      355         }
      356         if(FD_ISSET(sockv6query, &readfds)) {
      357           receive_response_and_echo(sockv6query);
      358           process_fd2 = 0;
      359         }
      360       }
      361     }
于 2012-05-23T18:54:45.123 に答える