1

最近、Windows 8 から Windows 8.1 にアップグレードしました。そのアップグレードの後、Java の TCP ソケットに関連する問題が発生し始めました。

私が取り組んでいるアプリケーションは、ServerSocket別のプロセスが接続してデータを送信する Java を利用しています。多くの OS と Java バージョンで何年も機能してきたかなり標準的なものです。

Windows 8.1 では、これらServerSocketの への接続が散発的に停止します。これは、ソケットを介して一度に送信されるデータの量に多少依存するようですが、一度に適度な ~1 kB のデータを送信する場合は、かなり簡単に発生します。

ソケットが「スタック」すると、次のことが起こります。

  • 送信側はデータの送信を終了し、ソケットを閉じます。プロセスは終了することさえあります。ということで、無事にデータが送信されたようです。
  • 受信側は通常、送信されたデータの一部またはすべてを取得します。ただし、readソケットのInputStream. 代わりに、プロセスは呼び出しで無期限にブロックされInputStream.readます。
  • netstat は、 へのソケット接続がまだ ESTABLISHED であることを示していますServerSocket。これは、データを送信したプロセスが終了した場合にも当てはまります (この場合netstat -b、接続が process に関連付けられていることが示されます) System
  • システム間の接続を試みましたが、まだ問題が発生します。具体的には、CentOS VM (Win 8.1 ボックスでホストされている) から Win 8.1 ボックスに接続しました。その場合、netstat「送信」(CentOS) マシンでは確立されたソケットが引き続き表示されませんが、「受信」(Windows 8.1) マシンでは確立されたソケット接続が表示されます。
  • ループバック インターフェース (127.0.0.1) と実際のネットワーク インターフェース (外部から見える IP を指定して) で接続を試みましたが、結果は同じでした。

Windows 8.1 にアップグレードしてから、ネットワークに関するその他の問題に気づいていません。Windows 8 で実行した場合も同じコードが機能していたため、OS のアップグレードが鍵となるようです。私の環境の詳細:

  • Windows 8.1 プロフェッショナル 64 ビット
  • Oracle HotSpot 7u40 JRE (7u45 と 6u37 で試しましたが、同じ結果が得られました)
  • デルのインスピロン 5720
  • 使用中の Realtek PCIe FE (有線) ネットワーク アダプター

これは、私の環境で問題を引き起こすJavaテストプログラムの要点です。SocketListener最初に実行する必要があります。バインドされているソケットを出力します。実行中のホストとバインド先のポートSocketTalkerの 2 つのパラメーターを指定して実行します。問題が発生すると、は新しいソケット接続を報告し、通常は少なくともデータの一部を受信したことを報告します。ただし、ソケット接続が閉じられたことは報告されません。SocketListenerSocketListenerSocketListener

バグが含まれている可能性はあると思いますSocketListenerが、多くの Java バージョン、JRE 実装、およびオペレーティング システムで何年も正常に動作している製品で使用されているコードをエミュレートしています。

Windows でネットワーク スタックをデバッグするためのテクニックを教えていただければ幸いです。私はWindows開発者ではありません...

編集:

問題のサンプルのWireshark キャプチャを次に示します。192.168.1.26 は SocketTalker を実行する CentOS マシンであり、192.168.1.9 は SocketListener を実行する Win 8.1 マシンです。データを受信した後、Windows ボックスが応答を停止したようです。話がまとまる前にキャプチャを止めたかもしれませんが、重要な部分は取得できたと思います。

4

1 に答える 1