Проверка наличия сервера удаленного взаимодействия .NET - правильный ли мой подход?

Невозможно установить время ожидания соединения при удаленном вызове .NET. Документация иногда ссылается наTcpChannel свойства, которые якобы делают это, нообсуждение и самый последнийдокументы Я обнаружил, что это невозможно. Можно установить таймаут для самого удаленного вызова, но не для начальной попытки подключения. Вы застряли с 45-секундным таймаутом по умолчанию.

По разным причинам я не могу использовать WCF.

Это вызывает проблему, когда удаленный сервер отключается. Если я пытаюсь сделать удаленный вызов, я застреваю на эти 45 секунд. Это не хорошо. Я хочу проверить наличие удаленного сервера. Пинг сPingTimeout Это самый простой подход, но я хочу проверить специально для удаленного сервера, а не просто машина, которая работает.

После некоторых экспериментов я пришел к такому подходу:

Асинхронно начните соединение сокета TCP с удаленным портом.Дождитесь завершения соединения или истечения времени ожидания (с помощью ManualResetEvent).Если асинхронный обратный вызов подключения был успешным, верните успех. В противном случае верните ошибку.

Это работает, но я не уверен в моем использовании моегоWaitHandle и розетка. Я также хотел бы заверить параллельные проверки безопасности потоков WRT, что я и сделал. Мой код ниже. Видите ли вы какие-либо проблемы с моим подходом?

private static bool IsChannelOpen(string ip, int port, int timeout)
{
    IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), port);
    Socket client = new Socket(endpoint.AddressFamily,
              SocketType.Stream, ProtocolType.Tcp);
    SocketTestData data = new SocketTestData()
              { Socket = client, ConnectDone = new ManualResetEvent(false) };
    IAsyncResult ar = client.BeginConnect
              (endpoint, new AsyncCallback(TestConnectionCallback), data);

    // wait for connection success as signaled from callback, or timeout 
    data.ConnectDone.WaitOne(timeout);
    client.Close();
    return data.Connected;
}

private static void TestConnectionCallback(IAsyncResult ar)
{
    SocketTestData data = (SocketTestData)ar.AsyncState;
    data.Connected = data.Socket.Connected;
    if (data.Socket.Connected)
    {
        data.Socket.EndConnect(ar);
    }
    data.ConnectDone.Set(); // signal completion
}

public class SocketTestData
{
    public Socket Socket { get; set; }
    public ManualResetEvent ConnectDone { get; set; }
    public bool Connected { get; set; }
}

Ответы на вопрос(2)

Ваш ответ на вопрос