2012-12-14 24 views
0

我編寫了一個簡單的TCP服務器來爲多個客戶端提供服務(它在telnet上運行得非常好)。但是,我想寫我自己的簡單的TCP客戶端與多路複用套接字和標準輸入。與往常一樣寫服務器的連接,連接代碼是可以的。複用客戶端中的stdin和套接字C

我有一個複用套接字和stdin輸入的問題。我的代碼,這使得最大的問題:

void multiplexClient(FILE *fp, int sockfd, char inbuffer[], char outbuffer[]) 
    { 
     int maxfd; 
     fd_set rset; 

     FD_ZERO(&rset); 
     for(;;) 
     { 
      FD_SET(fileno(fp), &rset); 
      FD_SET(sockfd, &rset); 
      maxfd = std::max(fileno(fp), sockfd) + 1; 

      int res = select(maxfd, &rset, NULL, NULL, NULL); 

      if(res < 0) 
      { 
       printf("'select error\n"); 
      } 

      if(FD_ISSET(sockfd, &rset)) 
      { 
       if(read(sockfd, inbuffer, sizeof(inbuffer)) == 0) 
        printf("read error\n"); 
       printf("Received: %s\n", inbuffer); 
       fflush(stdout); 
       memset(inbuffer, 0, sizeof(inbuffer)); 
      } 

      else if(FD_ISSET(fileno(fp), &rset)) 
      { 
       fprintf(stdout, "\n> "); 
       if(fgets(outbuffer, sizeof(outbuffer), fp) == NULL) 
        return; 
       write(sockfd, outbuffer, strlen(outbuffer)); 
       printf("Send: %s\n", outbuffer); 
       fflush(stdout); 
       memset(outbuffer, 0, sizeof(outbuffer)); 
      } 
     } 
    } 

// int main 
// sockfd = socket... 
// connect 

while(1) 
{ 
multiplexClient(stdin, socket_fd, inbuffer, outbuffer); 
} 

// ... 
    return 0; 
} 

我的第一個客戶:

$ ./client localhost 9034 
hello, other client! 

> Send: hel 
Received: hel 
Received: lo! ��~�~���~� 
Received: :) 

Received: wha 

我的第二個客戶端:

$ ./client localhost 9034 
hello! :) 

> Send: hel 
whats is wrong with this chat?! 

> Send: lo! 

> Send: :) 

> Send: 


> Send: wha 

如何解決這一問題?

回答

1

你的問題就在這裏(略轉述):

read(sockfd, inbuffer, sizeof(inbuffer)); 
printf("Received: %s\n", inbuffer); 

read調用返回寫入的字節(你忽略)的數量和緩衝區 C字符串(即它不是空終止)。

什麼你應該東西大致如下:

quant = read (sockfd, inbuffer, sizeof(inbuffer)); 
printf ("Received: %*.*s\n", quant, quant, inbuffer); 
+0

看到我的編輯,這wasnt它:( –

1

在將文件選擇器重新添加到集合之前,您錯過了FD_ZERO()

此外,這是C++,因爲它使用std::max()

+0

補充說,看到我的新崗位 - 它並沒有幫助過 –