2012-11-28 5 views
0

나는 select를 실험하고 있으며 사용자가 명령 줄에 입력 한 내용을 서버에 쓰는 간단한 응용 프로그램을 가지고 있습니다. 그런 다음 서버가이를 다시 에코합니다. select 함수를 사용하여 연결된 소켓과 stdin을 수신 대기합니다.소켓 및 표준에서 선택

클라이언트 코드 : 이제

const int BUFFER_SIZE = 1024; 
char *readArr = new char[BUFFER_SIZE]; 
fd_set rset; 
ssize_t n; 
string input; 
FD_ZERO(&rset); 
while(true){ 
    FD_SET(socketFD[0], &rset); 
    FD_SET(0, &rset); 

    maxfpd1 = max(socketFD[0], 0) + 1; 
    select(maxfpd1, &rset, NULL, NULL, NULL); 
    if(FD_ISSET(0, &rset)){ 
    cin>>input; 
    write(socketFD[0], input.c_str(), input.size()); 
    cout<<"\nSocket write!\n"; 
    } 
    if(FD_ISSET(socketFD[0], &rset)){ 
    n = read(socketFD[0], readArr, BUFFER_SIZE-1); 
    readArr[n] = '\0'; 
    cout<<"\nSocket read!\n"; 
    cout<<readArr; 
    } 
} 

, 내가 입력하면 "안녕하세요!" 명령 줄에서 Enter 키를 누르면 다음 출력이 표시됩니다.

Hello! //User input 

Socket write!//Client output 

Socket read!//Client output 

다시 입력 할 경우 "Hello!" 인쇄됩니다. 왜 내가 두 번이나 타격을해야합니까?

서버 출력에서 ​​첫 번째 메시지를 입력 한 후 서버로 메시지가 올바르게 전송 된 것을 볼 수 있습니다.

답변

1

cin>>input 줄 끝에서 줄 바꿈을 읽지 않으며 cout<<readArr 줄 바꿈을 쓰지 않습니다. cout<<readArr<<endl을 사용하면 문자열 다음에 개행을 쓰고 출력 버퍼를 비 웁니다. 문자열 다음에 개행을 원하지 않으면 endl 대신 flush을 사용하여 출력 버퍼 만 플러시 할 수 있습니다. 또한 출력을 버퍼링하지 않으려면 cout을 버퍼링하지 않도록 변경할 수 있습니다.

0

귀하의 cin>>input은 한 줄의 전체 단어를 읽지 않습니다. 줄 바꿈은 읽지 않으며 두 단어를 입력하면 두 단어를 읽지 않습니다. 대신 getline(cin,input)을 사용해야하며, 전체 줄을 읽고 input에 넣습니다 (줄 바꿈없이 버림).