ошибка при работе с сокетами
От: Аноним  
Дата: 26.10.06 12:58
Оценка:
Доброго времени суток!

беда у меня следующая:

FrameWork 2.0
Имеются сервер и клиент
между ними устанавливается асинхронное соединение черес сокеты
все работает, данные передаются в обе стороны и принимаются нормально
но как только я убиваю клиента например, сервер падает с ошибкой
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
В интернете пол дня ищу решение, но видимо не с того конца ищу.

Хотелось бы понять как при работе с сокетами отловить падение клиента и культурно сообщить од этом пользователю сервера

вот так детально выглядит стек:
System.AccessViolationException was unhandled
Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Source="System"
StackTrace:
at System.Net.UnsafeNclNativeMethods.OSSOCK.WSAGetOverlappedResult(SafeCloseSocket socketHandle, IntPtr overlapped, UInt32& bytesTransferred, Boolean wait, IntPtr ignored)
at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)


отловить бы по идее это записать в лог сервера инфу об отвале клиента и перестартнуть сервер но как ловить ?

может кто примерчик посоветует.
Re: ошибка при работе с сокетами
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 26.10.06 13:05
Оценка:
Здравствуйте, Аноним, Вы писали:

<skipped>

А>может кто примерчик посоветует.


The value of the Connected property reflects the state of the connection as of the most recent operation. If you need to determine the current state of the connection, make a nonblocking, zero-byte Send call. If the call returns successfully or throws a WAEWOULDBLOCK error code (10035), then the socket is still connected; otherwise, the socket is no longer connected.


// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}
Re[2]: ошибка при работе с сокетами
От: Аноним  
Дата: 27.10.06 05:31
Оценка:
Здравствуйте, pt4h, Вы писали:

P>Здравствуйте, Аноним, Вы писали:


P><skipped>


А>>может кто примерчик посоветует.


P>

P>The value of the Connected property reflects the state of the connection as of the most recent operation. If you need to determine the current state of the connection, make a nonblocking, zero-byte Send call. If the call returns successfully or throws a WAEWOULDBLOCK error code (10035), then the socket is still connected; otherwise, the socket is no longer connected.


у меня отправка производится асинхронно
но ошибка то, про которую я написал, вылетает в момент разрыва соединения, причем данные в этот момент не передаются.
Меня интересует, как мне отловить и главное где эту ошибку
Ошибка то где-то в system.dll, она не возникает при работе программы, она возникает если убить в диспетчере клиентское приложение

        private void SendString(string str)
        {
            try
            {
                byte[] smk = new byte[str.Length];
                smk = Encoding.Default.GetBytes(str);
                SocketError se;
                LocalSocket.BeginSend(smk, 0, smk.Length, SocketFlags.None, out se, new AsyncCallback(this.OnSend), LocalSocket);
                string s = se.ToString();
            }
            catch (AccessViolationException ave)
            {
                throw new Exception(ave.Message + ave.StackTrace);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        private void OnSend(IAsyncResult ar)
        {
            try
            {
                int i = LocalSocket.Available;
                SocketError se;
                int Ret = LocalSocket.EndSend(ar, out se);
                string s = se.ToString();
            }
            catch (AccessViolationException ave)
            {
                throw new Exception(ave.Message + ave.StackTrace);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
Re[3]: ошибка при работе с сокетами
От: Vlad Volkov  
Дата: 28.10.06 14:00
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, pt4h, Вы писали:


P>>Здравствуйте, Аноним, Вы писали:


P>><skipped>


А>>>может кто примерчик посоветует.


У меня когда-то было нечто подобное — правда при отключении ремотинг клиента — на сервере, причем где-то в недрах нативного кода судя по эксепшену.
Оказалось, что виноват IMON модуль NOD32 (антивирус такой). Установкой новой версии вылечилось.
Может быть нечто подобное и в вашем случае ?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[4]: ошибка при работе с сокетами
От: Стример Украина  
Дата: 28.10.06 20:10
Оценка:
Здравствуйте, Vlad Volkov, Вы писали:

P>>><skipped>


А>>>>может кто примерчик посоветует.


VV>У меня когда-то было нечто подобное — правда при отключении ремотинг клиента — на сервере, причем где-то в недрах нативного кода судя по эксепшену.

VV>Оказалось, что виноват IMON модуль NOD32 (антивирус такой). Установкой новой версии вылечилось.
VV>Может быть нечто подобное и в вашем случае ?

в ремотинге исключение валилось гдето в Unmanaged коде какогото колбэка, я лечил по другому — добавлял приложение в список исключений для контроля антивирусом (тоже NOD32)
Тот кто знает не говорит, тот кто говорит не знает.
Re[5]: ошибка при работе с сокетами
От: Аноним  
Дата: 01.11.06 06:26
Оценка:
Здравствуйте, Стример, Вы писали:

С>Здравствуйте, Vlad Volkov, Вы писали:


P>>>><skipped>


А>>>>>может кто примерчик посоветует.


VV>>У меня когда-то было нечто подобное — правда при отключении ремотинг клиента — на сервере, причем где-то в недрах нативного кода судя по эксепшену.

VV>>Оказалось, что виноват IMON модуль NOD32 (антивирус такой). Установкой новой версии вылечилось.
VV>>Может быть нечто подобное и в вашем случае ?

С>в ремотинге исключение валилось гдето в Unmanaged коде какогото колбэка, я лечил по другому — добавлял приложение в список исключений для контроля антивирусом (тоже NOD32)


у меня как раз тот же самый антивирус, обновляю регулярно, отключать пробовал и IMON и все целиком, не помогает...
Re: ошибка при работе с сокетами
От: drpadawan  
Дата: 01.11.06 09:26
Оценка:
Посоветую использовать не _неблокирующие_ сокеты как завещает Berkley standard, но асинхронные методы (.NET'a в данном случае). То есть, это BeginSend, BeginReceive, BeginConnect и т.д. Там нужно будет работать с асинхронными коллбэками. В каждом из коллбэков будет присутствовать синхронизация в виде вызовов EndSend, EndReceive, EndConnect и т.д. Вот если эти вызовы завернуть в исключение, то можно поймать на месте и отключение, и все другие ужасы, что могут произойти с сокетом.
Re[6]: ошибка при работе с сокетами
От: Vlad Volkov  
Дата: 01.11.06 21:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>у меня как раз тот же самый антивирус, обновляю регулярно, отключать пробовал и IMON и все целиком, не помогает...


Лично я скачал с сайта новую версию и переустановил NOD, после этого заработало... Но правда все равно помнится мне что отрубание IMON'а действительно помогало на старой версии.
ЗЫ: у мну сейчас NOD32 версии 2,51,30 — все работает так как и должно быть.
Если ничего не помогает, имхо дело может быть все таки в коде
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[6]: ошибка при работе с сокетами
От: Стример Украина  
Дата: 03.11.06 00:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

VV>>>У меня когда-то было нечто подобное — правда при отключении ремотинг клиента — на сервере, причем где-то в недрах нативного кода судя по эксепшену.

VV>>>Оказалось, что виноват IMON модуль NOD32 (антивирус такой). Установкой новой версии вылечилось.
VV>>>Может быть нечто подобное и в вашем случае ?

С>>в ремотинге исключение валилось гдето в Unmanaged коде какогото колбэка, я лечил по другому — добавлял приложение в список исключений для контроля антивирусом (тоже NOD32)


А>у меня как раз тот же самый антивирус, обновляю регулярно, отключать пробовал и IMON и все целиком, не помогает...


отключение не поможет — поможет только добавление в список исключений антивируса, либо удаление антивируса
Тот кто знает не говорит, тот кто говорит не знает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.