Это в значительной степени зависит от того, какой класс вы используете для установления и поддержания соединения.
Обычно я использую TcpClient, TcpListener и их асинхронные функции. При возникновении ошибки функция обратного вызова вызывается с e.Error! = Null. Обычно следует удалить сокет, который удобно доступен в e.UserState, из списка активных соединений.