2015-10-16 37 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做任何事情,那麼如何才能知道要打印多少個字符?