2012-12-14 23 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

补充说,看到我的新岗位 - 它并没有帮助过 –