5

私は組み込み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()すると、が適切な間隔で正常に実行されていることがわかります。

それ以来、両方とも成功を返すtcdrainfflushを追加しましたが、状況を改善していないようです。

どんな助けでもいただければ幸いです。

** UDPATE:サーバー側からwiresharkキャプチャを取得しました。非常に明確に、ハートビートは継続的に送信されています。Hicups、遅延はありません。しかし、クライアントで何か面白いものを見つけました。このテストケースのクライアント(Ubuntu 9.04のtelnet)は、(上記のように)ハートビートの受信を突然停止したようです。Wiresharkはこれを確認し、パケットの大きな一時停止を確認します。クライアントがハートビートの受信を停止すると、(クライアントで)キーストロークを押すと、クライアントのバッファ(すべてのハートビート)からデータが大量に発生するように見えます。クライアント上のWiresharkも、この大量のデータをすべて1つのパケットに表示します。

残念ながら、これが何を意味するのかはよくわかりません。これはラインモードのオン/オフのことですか?行末(\ r \ n)は非常にはっきりと通っています。

**更新2:telnetdの代わりにnetcatを実行すると、問題は再現できません。

4

1 に答える 1

1

私が最初に行うことは、Wireshark を取り出して、サーバーが本当にメッセージを送信しているかどうかを確認することです。サーバーとサードパーティの PC で Wireshark を実行すると有益です。最後のハートビートに違いはありますか?


編集。ええと、それはあなたのクライアントに関する興味深い発見でした。

途中で何らかの端末のようなものがあるようです。telnetd ではなく、 netcatプログラムを使用することをお勧めします。netcat は、TCP セッションを介して raw モードで任意のデータを特別なフォーマットなしで送信するように設計されており、任意のプロセスをソケットに接続する機能を備えています。Windows マシンでは、Raw モードで PuTTY を使用して同じことを行うことができます。

クライアントとサーバー間のサードパーティとのトラフィックを調べる価値があるかもしれません. カーネルは、ネットワークへの書き込みを最適化し、内部でデータをバッファリングしている可能性があります。これが、回線上で実際に起こっていることを確認する唯一の方法です。

于 2010-06-17T08:33:05.330 に答える