3

特に Visual Studio 2010 デバッガーでその状態を 2 回クエリすると、System.Net ソケットが自然に切断されます。

次のようにインスタンス化されます。

 _TCPConn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

後で、接続してループを設定し、「接続済み」プロパティを監視します。. .

     _TCPConn.Connect(this.IPAddress, REMOTE_TCP_PORT);

      // loop to figure out why / when we're disconnecting ...
      int loops;
      bool bState = false;
      for (loops = 0; loops < 100; loops++)
      {
          bState = _TCPConn.Connected;
          if (!_TCPConn.Connected) 
          {
              break;
          }
          Thread.Sleep(1000);
      }

Connect 呼び出しの直後に、その Connected プロパティがデバッガーでtrueになり、ネットワーク スニファーはホストとの接続が成功したことを示します。

しかし、デバッガーで Connected プロパティをもう一度調べると、falseと表示されます。

ループにブレークポイントを設定しないと、ループ全体 (100 秒) を通過し、ループアウトすると、Connected プロパティはデバッガーで初めて見たときにtrueになり、次回は falseになります。

10 秒または 15 秒間ループさせてブレークポイントを設定すると、デバッガーで最初に確認したときにtrueになり、2 回目に確認したときにfalseになり、その時点でループから外れて、デバッガーのアーティファクトだけではなく、実際には false に設定されています。

切断すると、ネットワーク スニファに関連付けられたアクティビティはありません。つまり、ホストによって切断されていません。

これはシングルスレッドのアプリケーションです。後でソケットを使用しようとしたときに、ソケットが切断されていることがよくあり、その理由を理解しようとしていたため、これを見始めました。

4

1 に答える 1

-1

この問題は、Visual Studio 2010 Express デバッガーのバグのようです。

上記のコメントで述べたように、デバッガーの 2 番目のタッチで自発的に切断されるというこの奇妙な動作は、XP マシンと Win 7 PC の 2 つの別々の PC で発生していました。さらに詳しく説明すると、XP マシンは産業用機器に接続され、Win7 PC はローカルホストに接続されていました。どちらの PC も Visual C# 2010 Express を実行していました。

そのため、Visual Studio 2010 の完全なプロ バージョンで試してみましたが、そのような動作は発生しませんでした。

最初にデバッガーを調べ始めた原因となった元の切断の問題は、デバッガーが私を切断しなくなった後、簡単に見つけることができました。これは、30 年間のプログラミングの中で見た中で最も奇妙な問題の 1 つだと思います。

于 2013-01-07T15:16:26.147 に答える