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)
отловить бы по идее это записать в лог сервера инфу об отвале клиента и перестартнуть сервер но как ловить ?
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 == WSAEWOULDBLOCKif (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);
}
}
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, pt4h, Вы писали:
P>>Здравствуйте, Аноним, Вы писали:
P>><skipped>
А>>>может кто примерчик посоветует.
У меня когда-то было нечто подобное — правда при отключении ремотинг клиента — на сервере, причем где-то в недрах нативного кода судя по эксепшену.
Оказалось, что виноват IMON модуль NOD32 (антивирус такой). Установкой новой версии вылечилось.
Может быть нечто подобное и в вашем случае ?
Здравствуйте, 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 и все целиком, не помогает...
Посоветую использовать не _неблокирующие_ сокеты как завещает Berkley standard, но асинхронные методы (.NET'a в данном случае). То есть, это BeginSend, BeginReceive, BeginConnect и т.д. Там нужно будет работать с асинхронными коллбэками. В каждом из коллбэков будет присутствовать синхронизация в виде вызовов EndSend, EndReceive, EndConnect и т.д. Вот если эти вызовы завернуть в исключение, то можно поймать на месте и отключение, и все другие ужасы, что могут произойти с сокетом.
Здравствуйте, <Аноним>, Вы писали:
А>у меня как раз тот же самый антивирус, обновляю регулярно, отключать пробовал и IMON и все целиком, не помогает...
Лично я скачал с сайта новую версию и переустановил NOD, после этого заработало... Но правда все равно помнится мне что отрубание IMON'а действительно помогало на старой версии.
ЗЫ: у мну сейчас NOD32 версии 2,51,30 — все работает так как и должно быть.
Если ничего не помогает, имхо дело может быть все таки в коде
Здравствуйте, <Аноним>, Вы писали:
VV>>>У меня когда-то было нечто подобное — правда при отключении ремотинг клиента — на сервере, причем где-то в недрах нативного кода судя по эксепшену. VV>>>Оказалось, что виноват IMON модуль NOD32 (антивирус такой). Установкой новой версии вылечилось. VV>>>Может быть нечто подобное и в вашем случае ?
С>>в ремотинге исключение валилось гдето в Unmanaged коде какогото колбэка, я лечил по другому — добавлял приложение в список исключений для контроля антивирусом (тоже NOD32)
А>у меня как раз тот же самый антивирус, обновляю регулярно, отключать пробовал и IMON и все целиком, не помогает...
отключение не поможет — поможет только добавление в список исключений антивируса, либо удаление антивируса
Тот кто знает не говорит, тот кто говорит не знает.