2011-02-09 16 views
5

状況は以下の通りです: 私はJavaアプリケーションを持っています。これは、TCP上でTCPスタックを持つマイクロコントローラと通信します。コントローラ上のスタックはうまく動作し、これを並べ替えることができます。Javaソケット:Socket.close()はWindowsとMacで異なる接続を終了しますか?

問題:コントローラへの接続を終了するとき、私は単にsocket.close()を使用し、接続は終了します。問題はありません。私のMacではこれも動作しますが、私がWiresharkをチェックすると、正規終了プロセス[FIN,ACK] - [ACK]がありますが、それに続いて[TCP Dup ACK]パケットがあります。これはWiresharkが要求しているので、[FIN,ACK]パケットに属します。これはMacでのみ発生し、私のMacまたはネットブックのVM上のWindowsマシンでは発生しません...

このDup-ACKパケットを送信させないようにするための調整がありますか?クローズドセッションがまだアクティブであると主張し、コントローラーに10回接続した後、スタックには新しい接続を受け入れる余地がなくなります。

誰かが私にヒントを与えることができれば本当に感謝しています!

+0

どのMac OSのバージョンですか? – Daniel

+0

Mac OS 10.6.6、Javaバージョン1.6.0_22 –

答えて

0

実際には、MCUのtcp/ipスタックのベンダーと話すことをお勧めします。

あなたはこの1つの特定のMacを微調整することができるかもしれませんが、あなたはこれをもっと永久に固定する必要があります。あなたが早くそれに対処しなければならないほど十分なMacがあります。

+0

一部のルーチンを変更して、非アクティブな接続エントリを自動的に削除しました。まだ興味深いことに、javaはWindowsマシンと比べてこの例ではMac上で動作が異なるようになっています... –

1

これは、OS提供のTCPスタック(これは私が信じている)の問題であれば、あなたのMacからデバイスにtelnet接続して接続を閉じることができます。このdup ackが依然として放出されるかどうかを見るだけです。それがあれば、Javaのバージョン/ベンダーを交換すること(例えば)はあまりうまく行かないでしょう...

...ああ、多分ファイアウォールで違法なパケットをフィルタリングすることができますか?それは野生の推測です、私は実際にMacOSのためのファイアウォールについて何も知らないので...

関連する問題