0
  1. Socket( ) を使用Socket A = new Socket...して送受信しています。
  2. 何かベッドが発生したとき (切断)、古いオブジェクトを閉じたり破棄したりしてから、新しいソケット ( A = new Socket...) をインスタンス化しようとしています (同じホスト/ポート)
  3. フェーズはconnect()正常にチェックアウトされ、リモート ホストは接続を認識します。
  4. 最初のバイトを送信しようとすると、すぐに次のようになります。

System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。オブジェクト名: 'System.Net.Sockets.Socket'。System.Net.Sockets.Socket.Send (Byte[] バッファー、Int32 オフセット、Int32 サイズ、SocketFlags socketFlags、SocketError& errorCode) で System.Net.Sockets.Socket.Send (Byte[] バッファー、Int32 オフセット、Int32 サイズ、 System.Net.Sockets.Socket.Send(Byte[] buffer) の SocketFlags socketFlags)

何か案は?

try
{
   CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
   CCMSocket.Connect(CCMServer, CCMPort);
}

ここで、ソケットを操作するときに、catch 句が をキャッチしSocketException、reconnect メソッドを呼び出します。

try
{
    //Verify the the socket is actually disconnected
    byte[] Empty = new byte[0];
    CCMSocket.Send(Empty);
}
catch (Exception ex)
{
    bool connected = false;
    int reconnectCounter = 0;
    do
    {
        reconnectCounter++;
        Disconnect(); //<-- Just CCMSocket.Disconnect(true) in a try/catch
        if (Connect(CCMServer, CCMPort)) // <-- method given above
        {
            connected = true;
            CCMSocket.Send(LoginData); // this fails
        }
    } while (!connected);    
}
4

1 に答える 1

1

Connectメソッドに新しいソケットを作成させ、そのソケットを返してデータを送信させます。もっと似たもの:

try
{
   CCMSocket = new Socket();
   CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
   CCMSocket.Connect(CCMServer, CCMPort);
   return CCMSocket
}

do
{
    reconnectCounter++;
    Disconnect(); //<-- Just CCMSocket.Disconnect(true) in a try/catch
    var newSocket = Connect(CCMServer, CCMPort); // <-- method given above
    if (newSocket != null) 
    {
        connected = true;
        newSocket.Send(LoginData); // should work
        CCMSocket = newSocket; // To make sure existing references work
    }
} while (!connected);

サーバーアプリケーションを構築するときは、非同期ソケットパターンも真剣に検討する必要があります。

于 2011-01-16T10:18:22.520 に答える