Невозможно установить время ожидания соединения на удаленном вызове .NET. Документация иногда относится к TcpChannel свойствам, которые предположительно делают это, но discussions и последние docs, которые я нашел, показывают, что это невозможно. Можно установить тайм-аут на самом удаленном вызове, но не на попытке первоначального подключения. Вы застряли с 45-секундным таймаутом по умолчанию.Проверка наличия сервера удаленной работы .NET - мой подход правильный?
По различным причинам я не могу использовать 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; }
}
Я всегда ненавидел это о Remoting. –