2011-05-03 48 views
0

我很困惑,我有一個服務器通過select()。我可以接受一些客戶。 但我只是在最後連接服務器時才從客戶端讀取信息。例如: :A,B,C的客戶端依次連接服務器。服務器剛剛打印出來的數據爲 。 你能告訴我爲什麼嗎?謝謝。 的主要代碼:選擇和一些客戶


謝謝,我已經更新了問題,我有http://www.gnu.org/s/hello/manual/libc/Server-Example.html

改變的代碼,但問題還是來了。 我仍然只從最後一個獲得數據。而我無法從前者獲得數據 。

主代碼是:

INT read_from_client(INT與filedes)
{ 字符緩衝區[MAXMSG];
int nbytes;

nbytes = read(filedes, buffer, MAXMSG); 

    if (nbytes < 0) 
    { 
      /* Read error */ 
      perror("read"); 
      exit(EXIT_FAILURE); 
    } 
    else if (nbytes == 0) 
    /* End-of-file. */ 
      return -1; 
    else 
    { 
      /* Data read. */ 
      fprintf(stderr, "Server: got message: '%s'\n", buffer); 
      return 0; 
    } 

}

INT ts_server_poll(結構tcp_server *服務器,timeval結構*超時) {
無符號整型I;
int nready,sockfd,k,j;

<br>//reset the fd set 
    _server_set_fd(server); 

    printf("maxfd is %d\n", maxfd); 
    FD_SET(server->fd, server->fd_set); 

    while (1) 
    { 
      /* Block until input arrives on one or more active sockets. */ 
      server->fd_readset = server->fd_set; 

      if (select(FD_SETSIZE, server->fd_readset, NULL, NULL, NULL) < 0) 
      { 
        perror ("select"); 
        exit(EXIT_FAILURE); 
      } 



      /* Service all the sockets with input pending */ 
      for (i = 0; i < FD_SETSIZE; ++i) 
        if (FD_ISSET(i, server->fd_readset)) 
        { 
          if (i == server->fd) 
          { 
            /* Connection request on original socket. */ 
            int new; 
            new = (int)accept(server->fd, 0, 0); 

            if (new < 0) 
            { 
              perror("accept"); 
              exit(EXIT_FAILURE); 
            } 

            FD_SET(new, server->fd_set); 
          } 
          else 
          { 
            /* Data arriving on an already-connected socket. */ 
            if (read_from_client(i) < 0) 
            { 
              close(i); 
              FD_CLR(i, server->fd_set); 
            } 
+1

誰教你使用這種縮進?你的代碼很難閱讀。如果您希望社區爲您提供幫助,請讓社區更輕鬆。 – qrdl 2011-05-03 06:23:16

+0

我編輯了那裏的內容以使其可讀,但我不確定我能否推斷一個問題。 – 2011-05-03 06:26:54

+0

這裏沒有代碼接受新連接或將它們添加到讀取集。 – 2011-05-03 06:31:13

回答

3

你的代碼缺少幾件事......接受新的連接,並遍歷讀集中的所有描述符。

下面是如何在服務器上使用選擇一個完整的例子:

http://www.gnu.org/s/hello/manual/libc/Server-Example.html

+0

謝謝我已經通過http://www.gnu.org/s/hello/manual/libc/Server-Example.html更新了它,但它仍然無法工作 – lxgeek 2011-05-04 06:06:27

1

你應該這樣做的循環。我的意思是,檢查FD_ISSET從0到maxfd + 1,然後是所有爵士樂。

for(sockfd = 0; sockfd < maxfd + 1; sockfd++) { 
    if(FD_ISSET(sockfd, server->fd_readset)) { 
     /* there is an event on sockfd */ 
    } 
} 

我有一段時間沒有使用select,但你應該確定。另外,你可能想跳過描述符0,1,2,但這會很難看。

+0

謝謝我已更新它,但它仍然無法正常工作。我是否使用非阻塞功能? – lxgeek 2011-05-04 06:07:13