2012-10-04 5 views
0

FTP 클라이언트를 쓰려고하는데 명령에 대한 서버 응답을 인쇄해야합니다. 이 명령 중 하나는 STAT입니다. 서버는 응답을 반환하고 응답을 read() 명령을 사용하여 읽을 수있는 소켓 버퍼에 있습니다. 문제는 STAT에 대한 응답 만 필요하기 때문에 END OF STATUS로 끝나는 것입니다. 이것은 내가 응답 읽고 쓴 코드 :소켓 버퍼 읽기

in = read(connFd, &timebuffer, sizeof(timebuffer));; 
while(in>0){ 
    printf("%s", timebuffer); 
    memset(&timebuffer, 0, sizeof timebuffer); 
    in = read(connFd, &timebuffer, sizeof(timebuffer)); 
} 
memset(&timebuffer, 0, sizeof timebuffer); 

내가 점점 오전 문제를 그 읽기() 함수는 버퍼를 통과하고 종료하지 않는 while 루프를 읽고 완료하고, 무한히 내 프로그램을 계속하면 그냥 거기 앉는다. Read() 함수가 데이터를 기다리고 있기 때문에 버퍼의 끝에 도달하면 read()가 멈추는지를 알 수있는 방법이 있는지 궁금합니다. read()가 x < 1을 반환 할 것이기 때문에 이것이 자동적으로 일어날 것이라고 생각했지만, 기다리고 있다면 문제가 무엇인지 이해하고있다. 어떻게 해결할 수 있을까요? 타임 아웃 (0)을 설정하는 방법이있어 이미 데이터가있는 경우에만 데이터를 읽습니다. 또한 내가 0으로 설정 한 "플래그"가 있음을 알고 있지만 많은 정보를 찾을 수 없습니다. 어떤 도움을 주셔서 감사합니다. 유일한 방법은 버퍼의 "END OF STATUS"문자열을 확인하는 것입니까? 내가 않는 strstr (버퍼)를 사용하는 것이

답변

0

하나 개의 솔루션은 그 버퍼를 읽은 상태 여부의 끝을 포함 후에 때마다 readbuffer로는, 확인하는 것이 될 수 없습니다 다시 read 다른 break 경우;

다른 비동기 I/O 용 솔루션은 selectpoll 기능을 사용합니다. 입력이 지정된 시간 내에 사용 가능한지 확인하십시오. 자세한 내용은 맨 페이지를 확인하십시오.

1

read은 (소켓을 비 블로킹으로 설정하지 않는 한) 블로킹 호출이므로 요청한 정확한 바이트 수를 수신하거나 소켓이 닫히면 반환됩니다.

소켓을 비 블로킹으로 설정하면 "읽기"가 0으로 돌아 오지만 프로그램이 확실히 빠르기 때문에 응답이 끝나지 않은 경우에도 응답을 얻을 수 있습니다. 네트워크.

추가 참고 사항 ... 모든 읽기를 연결하지 않으면 strstr()을 사용할 수 없습니다. 하나의 읽기에서는 종료 메시지의 1/2을 얻을 수 있고 다음 읽기에서는 남은 메시지를 얻을 수 있습니다.