私は組み込みLinux環境で働いています。
起動時にtelnetデーモンを起動し、特定のポートを監視し、接続を受信するとプログラムを起動します。
すなわち
telnetd -l /usr/local/bin/PROGA -p 1234
PROGA-不規則な間隔でいくつかのデータを出力します。データを出力していないときは、X期間ごとに「ハートビート」タイプの文字列を送信して、クライアントにまだアクティブであること、つまり「ハートビート\ r\n」を通知します。
ランダムな時間が経過すると、クライアント(Linuxバージョンのtelnetを使用します。によって起動されます:telnet xxx.xxx.xxx.xxx 1234)
'heartbeat \ r \n'の受信に失敗します
クライアントが見るデータ:
heartbeat
heartbeat
heartbeat
...
heartbeat
[nothing, should have received heartbeat]
[nothing forever]
ハートビートが送信されます:
result = printf("%s", heartbeat);
結果を確認すると、常にの長さですheartbeat
。syslogにログを記録printf()
すると、が適切な間隔で正常に実行されていることがわかります。
それ以来、両方とも成功を返すtcdrainとfflushを追加しましたが、状況を改善していないようです。
どんな助けでもいただければ幸いです。
** UDPATE:サーバー側からwiresharkキャプチャを取得しました。非常に明確に、ハートビートは継続的に送信されています。Hicups、遅延はありません。しかし、クライアントで何か面白いものを見つけました。このテストケースのクライアント(Ubuntu 9.04のtelnet)は、(上記のように)ハートビートの受信を突然停止したようです。Wiresharkはこれを確認し、パケットの大きな一時停止を確認します。クライアントがハートビートの受信を停止すると、(クライアントで)キーストロークを押すと、クライアントのバッファ(すべてのハートビート)からデータが大量に発生するように見えます。クライアント上のWiresharkも、この大量のデータをすべて1つのパケットに表示します。
残念ながら、これが何を意味するのかはよくわかりません。これはラインモードのオン/オフのことですか?行末(\ r \ n)は非常にはっきりと通っています。
**更新2:telnetdの代わりにnetcatを実行すると、問題は再現できません。