2015-10-16 88 views
0

我正在使用select从用户读取数据,并检查传入连接。这是我的代码,从C中的套接字读取数据

..... 
    socket has been created and is listening 


     while(1){ 
      printf("$ "); 
      fflush(stdout); 
      read_fds = master; 

      if(select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1){ 
       perror(" Select failed: "); 
       exit(-1); 
      } 
      for(int i=0; i <= fdmax; i++){ 

       if (FD_ISSET(i, &read_fds)) { 

        if(i == STDIN){//process user input 

         char usrInputStr[256]; 
         if ((rbytes = read(STDIN, usrInputStr, 256)) < 0) { 
          perror("Read error: "); 
          exit(-1); 
         } 

         fgets(usrInputStr, sizeof(usrInputStr), stdin); 


         printf("%s\n",usrInputStr); 

}else if(i == sockServer){//also need to check that this is a server 
        //handle new connection 
        addrlen = sizeof(remoteaddr); 
        sockClient = accept(sockServer, (struct sockaddr*)&remoteaddr, &addrlen); 
        if(sockClient < 0){ 
         perror("Accept failed: "); 
         exit(-1); 
        } 
        FD_SET(sockClient, &master); 
        if (sockClient > sockServer) 
        { 
         fdmax = sockClient; 
        } 

       } 

该代码不会将用户输入打印回I/O上。似乎无法理解发生了什么问题。

+0

您是否使用调试器?在你寻求帮助之前,你似乎有更多的工作要做。用一句不完整的代码块来说明“它坏了,为什么?”随机的人没有很高的生产力。 – mah

+0

'STDIN'应该是'STDIN_FILENO'。 – Barmar

回答

0

三个明显的事情跳出来:

  1. if (sockClient > sockServer)大概应该是if (sockClient > fdmax)

  2. 你从stdin中读取两次,一个是read(这很好),一次是fgets(这很糟糕)。

  3.    printf("%s\n",usrInputStr); 
    

    %s格式说明为C-风格的字符串,字符不是任意的阵列。您没有对rbytes做任何事情,那么如何才能知道要打印多少个字符?