Проблема приложения клиент-сервер C # - PullRequest
1 голос
/ 15 января 2010

Я запускаю свое приложение в сети, и в некоторых случаях клиент теряет соединение с сервером. По истечении этого времени, когда я хотел отправить сообщение на сервер, я получаю следующую ошибку: Операция не разрешена для неподключенных сокетов (что-то вроде этого).

Я подумал создать событие для типа объекта TcpClient и когда tcp_obj.Connected = false, чтобы вызвать функцию, чтобы прекратить выполнение текущего кода. Как я мог это сделать?

Или дать мне другие предложения.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 16 января 2010

На самом деле это очень старая проблема,

Если я правильно понимаю ваш вопрос, вам нужен способ узнать, подключено ли ваше приложение к серверу или наоборот.Если это так, то в качестве обходного пути можно использовать UDP-соединение только для проверки возможности подключения (я знаю, что это намного сложнее, чем опрос состояния соединения), вы можете проверить это перед отправкой данных.Поскольку UDP не ориентирован на соединение, вам не нужно подключаться при отправке данных

0 голосов
/ 15 января 2010

Я бы сначала проверил ваш объект подключения, чтобы убедиться, что вы подключены, прежде чем пытаться отправить сообщение. Также убедитесь, что вы используете свою логику отправки внутри try-catch, так что если вам случится отключиться в середине передачи, вы сможете возобновить работу, не разрывая ваше приложение.

псевдопользователей-код:

private void SendMessage(string message, Socket socket)
{
  if(socket.connectionState = States.Connected)
  {
      try{
        // Attempt to Send
      }
      catch(SocketException Ex)
      {
        // Disconenct, Additional Cleanup Etc.
      } 
}
}

Если вы находитесь в C #, до изменения состояния вашего соединения у вас будет запуск события отключения от сокета до изменения состояния вашего соединения. Убедитесь, что вы связали это событие, как только ваш сокет подключится.

0 голосов
/ 15 января 2010

Можем ли мы знать, почему вы используете TCP-сокеты? Для вызова tcp устройства или кода сервера?

Рекомендую, если для вызова приложения .net server используется Windows Communication Foudation. Выставлять сервисы просто по net.tcp, http и т. Д.

С уважением,

0 голосов
/ 15 января 2010

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

Мы часто используем сердцебиение в наших клиент-серверных приложениях для обнаружения ранних отключений и регистрации их на сервере. Таким образом, сервер может закрыть связанный сокет и освободить соединение обратно в пул.

Просто периодически отправляйте команду клиенту и ждите ответа. Если ответ не получен в течение тайм-аута, отсоедините и закройте потоки.

...