2009-08-28 23 views
0

TCP/IP経由でハードウェアに接続しようとしています。私はVBでこれを非常にスムーズに行い、C#で同じ結果を達成しようとしています。C#:ソケットの問題 - 数秒後に接続されたソケットが切断される

internal Socket connectSocket(IPEndPoint vIPEndPoint) 
    { 
     Socket lclSocket = new Socket(vIPEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 


      try 
      { 
       lclSocket.Connect(vIPEndPoint); 
      } 
      catch (Exception ex) 
      { 

      } 

     if (lclSocket.Connected) 
     { 
      string str = receiveResponse(lclSocket); 

      if (str.Contains(PFCommonVariables.m_strCommandDelimiter)) 
      { 
       _sockets.Add(vIPEndPoint, lclSocket); 
      } 
      else 
      { 
       lclSocket.Disconnect(true); 
      } 
     } 

     lclSocket.ReceiveTimeout = RECEIVE_TIMEOUT; 
     lclSocket.SendTimeout = SEND_TIMEOUT; 

     return lclSocket; 
    } 

私が言ったように、このコードは、VBのコードとまったく同じであり、そこに私は成功し、接続を維持することができます:

のコードは次のようになります。ここでC#の問題は、私がIPEndPointに行う 'socket.Connect'呼び出しの直後です.ConnectedプロパティはTrueと表示されます。私はWiresharkを通じたデータの送受信が成功したことを確認します。次に、if(lclSocket.Connected)ステートメントにブレークポイントを設定します。最初にここに来ると、ConnectedプロパティはTrueのままです。しかし、何もせずにここで1〜2秒待つと、Connectedプロパティはfalseになります。

したがって、接続は自動的に失われます。その後、私がデバッガをオンにして回線を待つと、WiresharkではPCとハードウェアの間で定期的に多数のキープアライブTCPメッセージが送信されています。私はこれらのことを訴えていませんが、問題の診断に役立つかもしれません...

答えて

0

私はこれを深く掘り下げています.SocketクラスのConnectedプロパティは必ずしも期待していた値を返すとは限りません。私はここで同様のポストを見つけました:

http://bytes.com/topic/c-sharp/answers/258127-how-use-socket-connected-property-properly

私が私が午前と思われるハーフオープンの状態、があるかもしれないと思われ、私はから送信されたメッセージを受信しようとすると問題が起こります。ハードウェアメッセージが実際に来る、しかし、私の受信ループは別の問題のため終了しません。しかし、ハードウェアがメッセージを送信したので、TCPプロトコルは接続が停止しているとみなし、Connectedプロパティをfalseに設定します。

私はVBで正確に同じことが起こると想定していますが、受信機能が正常に機能しているため、Connectedプロパティの変更は見られませんでした。 socket.Connectedがfalseの場合、まだメッセージを送信できるはずです。チェックアウトする価値があります。

0

lclSocket.Connected行にブレークポイントを置くと、サーバーに接続しています。その時点で、サーバーは次のコードに基づいて接続からの応答を送信するように見えます。十分な時間内にその応答に応答しないとサーバーから切断されますか?

また、tcpトラフィックの場合は、tcpclientクラスを調べるとよいでしょう。

+0

いいえ、リモートエンドは応答がないか、タイムアウトしているという意味では「ダム」です。 PCは切断通話が終了するまで接続を維持する必要があります。正確に同じVBコードのバージョンは期待どおりに機能し、切断されません。また、切断を示すパケットは送信されていないようです。 – sbenderli

関連する問題