选择和一些客户

问题描述:

我很困惑,我有一个服务器通过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

你的代码缺少几件事......接受新的连接,并遍历读集中的所有描述符。

下面是如何在服务器上使用选择一个完整的例子:

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

你应该这样做的循环。我的意思是,检查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