0

私の質問は:(select()を使用して)新しいクライアントがサーバーに接続しているかどうかをどのように知ることができますか?accept()がブロックしているため、単にacceptを使用することはできません...

例:fd user1(fd = 4)とuser2(fd = 5)に2つのクライアントを設定しています。だから、私はselectを使って誰がソケットに書いているのかを知る:

  FD_ZERO(read_fds);
  FD_SET(user1, read_fds);
  FD_SET(user2, read_fds);
  error = select(user2 + 1, read_fds, NULL, NULL, NULL);
  if (FD_ISSET(user1, read_fds) == 1)
     printf("user1 talks.\n");
  ...

しかし、新しいユーザーがサーバーに接続しているかどうかを知りたいのですが、どうすればよいですか?私は試しました:

  FD_ZERO(read_fds);
  FD_SET(user1, read_fds);
  FD_SET(user2, read_fds);
  FD_SET((user2 + 1), read_fds);
  error = select(user2 + 2, read_fds, NULL, NULL, NULL);
  if (FD_ISSET(users2 + 1) == 1)
  {
      printf("New user.\n");
      accept(..., ...);
  }
  ...

しかし、このコードでは、毎回return-1を選択します...

解決策 ?^^

4

1 に答える 1

2

たとえば、リストのように、接続されたクライアントをどこかに保存する必要があります。

struct client_node
{
    int sockfd;
    /* Other data that might be needed */
    struct client_node *next;
};

struct client_node *client_list = NULL;

/* ... */

FD_ZERO(&read_fds);
FD_SET(listening_socket, &read_fds);

int maxfd = listening_socket;

for (struct client_node *c = client_list; c; c = c->next)
{
    FD_SET(c->sockfd, &read_fds);
    maxfd = MAX(maxfd, c->sockfd);
}

int res = select(maxfd + 1, &read_fds, NULL, NULL, NULL);

のブロックの問題についてはaccept、ご覧のlistening_socketとおり、リッスンしているソケットであるソケット (変数 ) を追加しました。そこselectから読み取ることができるということは、新しい接続があり、accept を呼び出すことができることを意味します。

于 2012-04-19T12:32:13.310 に答える