Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.02.2015, 14:20
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию Переподключение клиента к серверу

Здравствуйте. Возникла необходимость реализовать переподключение клиента к серверу. Конкретизирую: допустим, пользователь запускает программу-клиент в то время, когда сервер отключен. Нужно сделать так, чтобы клиент начал с определенным интервалом пытаться подключиться к серверу. Без выбрасывания всяких ошибок и тд.
Пробовал реализовать через clientError, логическую переменную и таймер, но не вышло.
Заранее благодарю
Ответить с цитированием
  #2  
Старый 24.02.2015, 15:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
int connect(
  SOCKET s,
  const struct sockaddr* name,
  int namelen
);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 24.02.2015, 15:21
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
Код:
int connect(
  SOCKET s,
  const struct sockaddr* name,
  int namelen
);

Прошу прощения, но я ничего не понял. Это даже кажется не на Delphi)
Ответить с цитированием
  #4  
Старый 24.02.2015, 16:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

функция connect() вернет либо 0 в случае успеха, либо SOCKET_ERROR. никаких выбрасываний ошибок.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 24.02.2015, 16:17
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
функция connect() вернет либо 0 в случае успеха, либо SOCKET_ERROR. никаких выбрасываний ошибок.
Ну ваша функция написана на с++, походу, придется ее переделывать.
Ответить с цитированием
  #6  
Старый 24.02.2015, 16:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

это не моя функция, это Microsoft в модуле WinSock она уже есть.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 24.02.2015, 16:57
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

А как ее включить в свою программу?) А то не имел опыта работы с подобным
Ответить с цитированием
  #8  
Старый 24.02.2015, 17:10
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Господа, перестанте морочинь голову человеку.
Я так понимаю связь осуществляется посредством TCPServer, TCPClient?
Я сам на них не строил, делал на ServerSocket + ClientSocket.

Так вот, там обработка события ClientSocketError дает вполне удобный поть для переподключения.
1. Смотришь какой код ошибки. В зависимости от кода что-то выводишь пользователю.
2. Если надо - запускаешь таймер который попытается переподключить клиента к серверу через некоторое время (не забываешь в процедуре OnTimer отключать таймер, чтобы он при успехе не пытался заново подключаться).
3. Не забываешь обнулить ErrorCode.

Как-то так.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 24.02.2015, 17:18
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Господа, перестанте морочинь голову человеку.
Я так понимаю связь осуществляется посредством TCPServer, TCPClient?
Я сам на них не строил, делал на ServerSocket + ClientSocket.

Так вот, там обработка события ClientSocketError дает вполне удобный поть для переподключения.
1. Смотришь какой код ошибки. В зависимости от кода что-то выводишь пользователю.
2. Если надо - запускаешь таймер который попытается переподключить клиента к серверу через некоторое время (не забываешь в процедуре OnTimer отключать таймер, чтобы он при успехе не пытался заново подключаться).
3. Не забываешь обнулить ErrorCode.

Как-то так.

Спасибо за ясный ответ.
Связь осуществляется как раз таки на ServerSocket ClientSocket.
Суть в том, что сама ошибка не должна появляться на экране. Программа не может подключиться-ну и тихонько пробовать себе реконнектится. Вот в этом суть
Ответить с цитированием
  #10  
Старый 24.02.2015, 17:38
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
уть в том, что сама ошибка не должна появляться на экране.
Не забываешь обнулить ErrorCode.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 24.02.2015, 17:44
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Не забываешь обнулить ErrorCode.
Последний вопрос, и буду пробовать. Как получить код ошибки?
Ответить с цитированием
  #12  
Старый 25.02.2015, 09:52
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

В перемонной ErrorCode и лежит код ошибки.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #13  
Старый 25.02.2015, 19:00
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
В перемонной ErrorCode и лежит код ошибки.
Попробовал сделать по вашему совету. Задал глобальную логическую переменную con, которая показывала наличие соединения. Далее при событии Connect переменной con присваивалось true, при событии Error соответсвенно давалось значение false, закрывался сокет и запускался таймер, таймер смотрел на значение con'a и либо выключался (если con=true) либо открывал сокет (если con=false). Но не вышло. Реконекта нету, и ошибка появляется
Ответить с цитированием
  #14  
Старый 25.02.2015, 21:38
fn12gl34 fn12gl34 вне форума
Прохожий
 
Регистрация: 09.01.2015
Сообщения: 30
Версия Delphi: 10
Репутация: 10
По умолчанию

Все, нашел где косяк. Спасибо большое за ответы
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter