2009-06-01 2 views
0

간단한 텔넷 클라이언트 라이브러리를 작성하고 있습니다. 나는 fsockopen()을 사용하여 소켓을 열고 fgetc()와 fwrite()를 사용하여 소켓을 읽고 쓴다. 필자는 fread() 대신 fgetc()를 사용하여 Telnet 특수 명령과 (IAC, ...)와 같은 옵션을 처리합니다.PHP의 소켓에서받은 모든 데이터를 읽으십시오.

문제는 대부분 소켓에서 읽는 중입니다. 반환하는 데 너무 오래 걸립니다. 프로파일을 작성 했으므로 연결 시간이 끝나면 결과가 나타납니다.

$char = $this->getChar(); 
if ($char === false) { 
    // end of the stream. 
} 

스트림이 완료되는 것을 알아내는 다른 방법이 :

protected function getChar() 
{ 
    $char = fgetc($this->_socket); 
    return $char; 
} // public function getChar() 

현재 나는 확실히 스트림을 완료하기 위해이 조건을 사용 : 여기

는 내 독서 방법입니다 모든 데이터를 읽었습니까?

Udate : 텔넷 프로토콜의 EOF 문자는 PHP가 EOF로 기대하는 것이 아니므로 스크립트가 스트림의 끝을 찾을 수없는 이유입니다. 누구든지 텔넷 프로토콜에서 EOF (파일 끝) 문자가 무엇인지 알고 있습니까?

+1

텔넷 세션은 전이중 또는 반이중입니까? –

+0

잘 모르겠습니다. 어떻게 알 수 있습니까? – farzad

답변

1

받은 각 문자의 16 진수 값을 반향시켜보십시오. PHP가 EOF로 인식하지 못하는 경우에도 EOF로 수신중인 것을 볼 수 있어야합니다. 살펴보고 ord()bin2hex()

+0

좋은 아이디어. 나는 그것을 시도하고 특별한 성격이 없다는 것을 발견했다. : D – farzad

1

유용 할 수있는 feof()이 있습니다.

+0

나는 그것을 역시 시도했다, 도왔다. PHP 문서 phof()에 따른 은 파일 포인터가 EOF이면 true를 반환하고 파일 포인터가 EOF이면 fgetc()는 false를 반환합니다. 그래서 그것은 $ char === false와 feof() 사이에 어떤 차이가 있는지 확신하지 못합니다. 거기 있니? – farzad

+1

아마도 그렇지 않습니다. 연결이 정상적으로 닫히면 EOF가 즉시 반환됩니다. 시간이 초과되면 알 수 없습니다. – grawity

0

검색해 본 결과 유용하지 않습니다. 파이썬에서 telnetlib이이 문제에 대해 무엇을하는지 알아 내려고했습니다 (저는 파이썬을 배웠습니다). 파이썬 라이브러리조차도 EOF를 찾지 못한다는 것을 알았습니다. 타임 아웃 할 때까지 또는 일정 시간이 경과 할 때까지 스트림을 계속 읽거나 특수 문자열을 검색하면 결과가 반환됩니다. 그래서 나는 같은 방법으로 읽고 문제를 해결했다. 모든 답변과 의견에 감사드립니다. 필자는 회사에 오픈 소스 호환 라이센스를 사용하여 텔넷 라이브러리를 배포하도록 설득하려고 노력할 것입니다. 이런 일이 생기면 여기에서 업데이트하겠습니다.

+0

텔넷 라이브러리가 완성되어 오랫동안 사용되었습니다. 저의 관리자는 아파치 라이선스 버전 2.0에서 소스 코드를 공개하기로 동의했습니다. 곧 다운로드 URL을 게시 할 것입니다. – farzad

0

텔넷에 스트림 토큰 (char)이 없습니다. 그냥 프롬프트를 보내고 보내기를 멈 춥니 다. 가장 좋은 방법은 프롬프트 텍스트에 출력 스트림을 트랩하는 것입니다.

관련 문제