ObjectDisposeException при попытке отправить через вновь открытый сокет - PullRequest
0 голосов
/ 16 января 2011
  1. Я использую Socket (Socket A = новый Socket ...) для отправки / получения.
  2. когда что-то происходит (отключение), я пытаюсь закрыть / удалить старый объект, а затем создаю новый сокет (A = новый сокет ...) (тот же хост / порт)
  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, SocketFlags socketFlags) в System.Net.Sockets.Socket.Send (Байт [] буфер)

Есть идеи?

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

Теперь при работе с сокетом предложение catch перехватывает SocketException и вызывает метод пересоединения:

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);    
}

1 Ответ

1 голос
/ 16 января 2011

У вашего метода 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);

При создании серверных приложений следует также серьезно учитывать шаблон асинхронного сокета .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...