저는 임베디드 리눅스 환경에서 작업하고 있습니다.텔넷 클라이언트 연결이 데이터 수신을 중지하고 서버가 계속 전송 중임
시작시 텔넷 데몬을 시작하여 특정 포트를 감시하고 연결이 수신되면 프로그램을 시작합니다.
즉
telnetd -l /usr/local/bin/PROGA -p 1234
PROGA -가 출력 불규칙한 간격 일부 데이터. 데이터를 출력하지 않을 때마다 "하트 비트 \ r \ n"이라는 클라이언트에 알리는 "하트 비트"유형 문자열을 보내는 X 시간마다
임의의 시간이 지난 후, 클라이언트는 (에 의해 시작 텔넷의 리눅스 버전 사용 : 수신 할 수 없게됩니다 telnet xxx.xxx.xxx.xxx 1234)
을 '하트 비트 \ 연구 \ n'을
데이터 클라이언트가 보는 :
heartbeat
heartbeat
heartbeat
...
heartbeat
[nothing, should have received heartbeat]
[nothing forever]
하트 비트가 전송됩니다
result = printf("%s", heartbeat);
점검 결과 길이는 항상 heartbeat
입니다. syslog에 로그인하면 printf()
적절한 간격
I 이후 tcdrain 모두 성공을 반환 fflush A의 추가 한에서 성공을 실행하지만, 상황에 도움이 보이지 않는 것을 우리에게 보여줍니다.
도움을 주시면 감사하겠습니다.
** UDPATE : 서버 측에서 wireshark 캡처를 받았습니다. 아주 분명히 하트 비트가 계속 전송되고 있습니다. 딸꾹질이없고 지연도 없습니다. 클라이언트에 흥미있는 것을 발견했다. 이 테스트 케이스 (우분투 9.04의 텔넷)에있는 클라이언트는 갑자기 하트 비트 받기를 멈춘 것 같습니다 (위에서 설명한 바와 같습니다). Wireshark는 이것을 확인하여 패킷에 큰 멈춤을줍니다. 일단 클라이언트가 하트 비트 수신을 중단하면 클라이언트의 모든 키 입력을 누르면 클라이언트의 버퍼 (모든 하트 비트)에서 데이터가 추출됩니다. 클라이언트의 Wireshark는이 엄청난 양의 데이터를 모두 하나의 패킷으로 보여줍니다.
불행히도 나는 이것이 실제로 무엇을 의미하는지 모른다. 이것은 라인 모드 on/off 것입니까? 줄 끝 (\ r \ n)은 매우 명확하게 전달됩니다.
** 업데이트 2 : telnetd 대신 netcat을 실행하면 문제가 재현되지 않습니다.
보내시는 다른 문자열은 어떻게 생겼습니까? 255 바이트를 보내면 이스케이프해야합니다 ... – Spudd86
이 버그/문제는 '하트 비트'문자열을 반복해서 보내면 재현 될 수 있으므로 다른 문자열은 적절하지 않다고 생각합니다. – Tree77