2016-09-18 6 views
0

Я использую сокеты NetMQ для взаимодействия клиент-сервер. У меня есть один сервер, который слушает порт 5555 и клиент, то есть .bind() -s.Как определить состояние соединения клиентского сокета?

Вот мой пример кода:

using (NetMQContext ctx = NetMQContext.Create()) 
{ 
    using (var client = ctx.CreateRequestSocket()) 
    {        
      client.Connect("tcp://127.0.0.1:5555");        
      client.SendFrame(jData);        
    } 
} 

То, что я хотел бы сделать, это сообщить пользователю, если клиент не находит сервер слушает этот порт.

Что происходит на самом деле, так это то, что если сервер не прослушивает этот порт, то никаких исключений не возникает и вызывается .sendFrame(), и приложение выходит из строя.

Есть ли какой-либо метод, такой как Исключения или код состояния, который может сообщить мне, если соединение выполнено или нет?

+0

Не могли бы вы запросить свойство соединения, которое заставило бы соединение с b создать или потерпеть неудачу. Например, вы можете запросить идентификатор соединения TCP/IP от локального клиента, который может заставить соединение открыть –

+0

. Я попытался найти какое-либо свойство или способ связи, если соединение невозможно. По моему мнению, структура zeromq/netmq не уведомляет об этом. Независимо от того, подключен ли клиент или сервер, библиотека попытается подключиться, когда это возможно. – Snake

ответ

1

Лучший способ сделать это с тайм-аутом ответа. Итак, отправьте запрос (с таймаутом), а затем дождитесь ответа с таймаутом. Если сервер не ответил в течение таймаута, вы можете пойти и попытаться подключиться к следующему серверу. Вроде бы так:

if (client.TrySendFrame(TimeSpan.FromSeconds(2), jData) && 
    client.TryReceiveFrame(TimeSpan.FromSeconds(2), out jData)) 
{ 
    // Server is online 
} 
else 
{ 
    // Server is down 
} 
+0

Отлично! Но когда я проверяю ответ в течение таймаута, если ответ не отправлен, приложение выходит из строя. Если проверка является ложной, то выполнение переходит к инструкции else, которая должна возвращать вызывающему абоненту ложное или другое сообщение. Кажется, что поток застревает и не возвращается к вызывающему абоненту. – Snake

+0

Я не уверен, что понимаю, что внутри оператора if у вас уже есть ответ в jData. Какое исключение вы получаете? – somdoron

+0

Хотелось бы, если сервер не работает, чтобы остановить и выйти из функции, продолжайте мой код. Но в этом случае (Server down), если я вернусь к вызывающей стороне с else {return false;}, приложение застрянет. В целом отладка я заметил, что при выходе из операторы using без получения ответа с сервера приложение застревает. Я не английский, поэтому надеюсь, что это ясно. – Snake