2010-06-14 3 views
5

저는 임베디드 리눅스 환경에서 작업하고 있습니다.텔넷 클라이언트 연결이 데이터 수신을 중지하고 서버가 계속 전송 중임

시작시 텔넷 데몬을 시작하여 특정 포트를 감시하고 연결이 수신되면 프로그램을 시작합니다.

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을 실행하면 문제가 재현되지 않습니다.

+0

보내시는 다른 문자열은 어떻게 생겼습니까? 255 바이트를 보내면 이스케이프해야합니다 ... – Spudd86

+0

이 버그/문제는 '하트 비트'문자열을 반복해서 보내면 재현 될 수 있으므로 다른 문자열은 적절하지 않다고 생각합니다. – Tree77

답변

1

내가 할 첫 번째 일은 Wireshark를 꺼내 서버가 진정으로 메시지를 보내는 지 알아 내려고하는 것입니다. 서드 파티 PC뿐만 아니라 서버에서도 Wireshark를 실행하는 것이 좋습니다. 마지막 심장 박동과 다른 점이 있습니까?


편집. 글쎄, 그것은 당신의 클라이언트에서 흥미로운 발견했다.

도중에 단말 장치가있는 것 같습니다. telnetd가 아닌 netcat 프로그램을 사용할 수 있습니다. netcat은 특수한 포맷팅없이 raw 모드에서 임의의 데이터를 TCP 세션을 통해 전송하도록 설계되었으며 임의의 프로세스를 소켓에 연결할 수 있습니다. Windows 시스템에서는 PuTTY를 원시 모드로 사용하여 동일한 작업을 수행 할 수 있습니다.

클라이언트와 서버 간의 제 3 자와의 트래픽을 조사 할 필요가 있습니다. 커널은 네트워크 쓰기 및 데이터를 내부적으로 버퍼링하는 것을 최적화 할 수 있습니다. 그것이 실제로 보이는 것이 와이어에서 실제로 일어나는지 확인하는 유일한 방법입니다.

+0

예 전날 데이터 캡처를 위해 wireshark를 생각했습니다. 클라이언트로부터 wireshark 데이터를 받았습니다. 그 심장 박동을 보지 못했습니다. 서버에서 wireshark를 가져오고 있습니다. 해당 데이터를 받으면 질문을 업데이트합니다. 하트 비트에 대해 다른 것도없고 동적 인 것도 없습니다. Linux 클라이언트 (테스트 용)는 우분투 9.04를 사용하는 텔넷 클라이언트입니다. – Tree77

관련 문제