Krótka historia sprawy: Łączę się z urządzeniami po Modbusie - w tym przypadku po TCP. Posiadam kod obecnie mniej więcej taki:
if (modbusMaster == null)
modbusMaster = Create(); //nowe połączenie TCP
try
{
modbusMaster.Read();
}
catch(Exception e)
{
modbusMaster.Dispose(); //dispose połączenia
modbusMaster = null;
}
Chciałbym ograniczyć disposowanie połączenia tylko wtedy gdy jest to absolutnie konieczne, to znaczy wtedy gdy faktycznie socket został zamknięty.
Normalnym jest, że czasem dostaję wyjątek System.IO.IOException: Nie można odczytać danych z połączenia transportowego: Próba połączenia nie powiodła się, ponieważ połączona strona nie odpowiedziała poprawnie po ustalonym okresie czasu...
i wtedy wiem, że mogę działać na nim dalej.
Pytanie: Czy jest sposób, żeby rozpoznać po samym wyjątku czy połączenie zostało zamknięte. Chodzi konkretnie o IOException
, bo co do SocketException
i InvalidOperationException
nie mam wątpliwości.
Dobrałem się do HRESULT
poprzez int errorCode = Marshal.GetHRForException(e);
. Dostałem wartość -2146232800
czyli 0x80131620, ale jak dotąd nie udało mi się tego rozkodować.
EDIT:
Znalazłem tutaj http://blogs.msdn.com/b/eldar/archive/2007/04/03/a-lot-of-hresult-codes.aspx
COR_E_IO 0x80131620 -2146232800
hmm ale to mi jakoś nie pomogło...
EDIT2:
Patrząc w źródła IOException ustawia tą wartość jako domyślną - fajnie.
[__DynamicallyInvokable]
public IOException(string message)
: base(message)
{
this.SetErrorCode(-2146232800);
}