2012-12-14 4 views
0

나는 많은 클라이언트 (텔넷과 함께 훌륭하게 작동 함)를 서비스하기 위해 간단한 TCP 서버를 작성했습니다. 하지만, 소켓과 표준 입력을 멀티플렉싱하는 간단한 TCP 클라이언트를 작성하고 싶었습니다. 평소와 같이 쓴 서버 연결, 연결 코드는 괜찮습니다.클라이언트 C의 표준 입력과 소켓을 멀티플렉싱

멀티플렉싱 소켓 및 표준 입력에 문제가 있습니다.

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 문자열 (즉, 그것은 null이 아니다 종료 됨). 당신이이 있어야한다 하면 다음과 같은 라인을 따라 뭔가

입니다 :

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

를 않네 내 편집을 확인하는 데 도움이 didnt는이 :( –

1

파일 선택기를 세트에 다시 추가하기 전에 FD_ZERO()이 누락되었습니다.

std::max()을 사용하므로 C++입니다.

+0

추가, 나의 새로운 게시물을 참조 - 너무 –