Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.29;
Скачать: CL | DM;

Вниз

ServerSocket, ClientSocket и "выдергивание шланга из сетевухи"   Найти похожие ветки 

 
Denizzz   (2006-10-25 12:51) [0]

Как отловить разрыв соединения при выдергивании шланга из сетевой платы (отказ свитча и т.п.)?
Проверял - событие OnClientError и OnError не происходит.


 
Сергей М. ©   (2006-10-25 12:53) [1]

Попытаться вызвать один из методов приема-передачи - в "шлаговых" случаях метод возбудит исключение.


 
Denizzz   (2006-10-25 12:54) [2]

Т.е. пытаться по таймеру пускать тестовые пакеты?


 
Сергей М. ©   (2006-10-25 12:56) [3]


> Denizzz   (25.10.06 12:54) [2]


Как вариант можно и так.


 
Denizzz   (2006-10-25 13:06) [4]

Есть еще варианты?


 
Сергей М. ©   (2006-10-25 13:13) [5]

Касаемые [1] - нет. И быть таковых не может.

Касаемые таймера - он попросту не нужен, если ClientType = ctBlocking.


 
Denizzz   (2006-10-25 13:24) [6]

Установлено ClientType = ctNonBlocking


 
Сергей М. ©   (2006-10-25 13:26) [7]

И чем в этом случае таймер не вариант ?


 
Denizzz   (2006-10-25 13:42) [8]

Делаю ClientSocket1.Socket.SendText("бла-бла"); - ошибки не возникает


 
Сергей М. ©   (2006-10-25 13:43) [9]

Значит на момент исполнения этого "делаю" ситуации а-ля "шланговая" не возникает.


 
Denizzz   (2006-10-25 13:48) [10]

вот-вот... а шланг выдернут :(


 
Сергей М. ©   (2006-10-25 14:01) [11]

Ну и что ?

Как только ты попытаешься что-нть почитать или пописАть для этого соединения, тут же получишь исключение - это и будет фактом "шланга".


 
Denizzz   (2006-10-25 14:03) [12]

но ведь я так и делаю по таймеру (8)!!


 
Сергей М. ©   (2006-10-25 14:09) [13]

Показывай код..


 
Denizzz   (2006-10-25 14:18) [14]


procedure TForm1.TimerTestTimer(Sender: TObject);
begin
 ClientSocket1.Socket.SendText(".");
end;


 
Сергей М. ©   (2006-10-25 14:19) [15]

и еще обработчик OnError ..


 
Denizzz   (2006-10-25 14:20) [16]

при этом если проверять
if ClientSocket1.Socket.Connected=True then
Memo1.Lines.Add("s-s-s") else Memo1.Lines.Add("w-w-w");

возвращает "s-s-s"


 
Denizzz   (2006-10-25 14:21) [17]

procedure TForm1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
if ErrorCode=10061 then
 Memo1.Lines.Add(DateTimeToStr(Now())+" - Ñîåäèíåíèå ñ ñåðâåðîì îòñóòñòâóåò")
else if ErrorCode=10053 then begin
 Memo1.Lines.Add(DateTimeToStr(Now())+" - Ñîåäèíåíèå ñ ñåðâåðîì ïîòåðÿíî");
 Memo1.Lines.Add("- áóäåò âêëþ÷åí òàéìåð ïðîâåðêè ñîåäèíåíèÿ");
 end;
Memo1.Lines.Add(DateTimeToStr(Now())+" - êîä îøèáêè "+IntToStr(ErrorCode));
ErrorCode := 0;
SpeedButton1.Enabled:=False;
ClientSocket1.Close;
Icona("error.ico",NIM_MODIFY);
TimerWait.Enabled:=True;


 
Denizzz   (2006-10-25 14:22) [18]

procedure TForm1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
if ErrorCode=10061 then
 Memo1.Lines.Add(DateTimeToStr(Now())+" - текст")
else if ErrorCode=10053 then begin
 Memo1.Lines.Add(DateTimeToStr(Now())+" - текст");
 Memo1.Lines.Add("- текст");
 end;
Memo1.Lines.Add(DateTimeToStr(Now())+" - Код ошибки "+IntToStr(ErrorCode));
ErrorCode := 0;
SpeedButton1.Enabled:=False;
ClientSocket1.Close;
Icona("error.ico",NIM_MODIFY);
TimerWait.Enabled:=True;


 
Сергей М. ©   (2006-10-25 14:23) [19]


> ClientSocket1.Socket.SendText("."); //<- Сюда брейкпойнт ставил ?


 
Denizzz   (2006-10-25 14:37) [20]

Да. Ничего


 
Сергей М. ©   (2006-10-25 14:43) [21]

Что занчит "ничего" ? Не ловишь ее или что ?


 
Denizzz   (2006-10-25 14:45) [22]

ловит


 
Denizzz   (2006-10-25 14:45) [23]

она выполняется


 
Сергей М. ©   (2006-10-25 14:50) [24]

т.е. ты утверждаешь, что:

1) ты поймал упомянутый брейкпойнт.
2) пошел и выдернул "шланг" у парнера по соединению
3) нажал F9
4) не получил исключения на уже упомянутой выше строчке с брейкпойнтом
5) и не поймал брейкпойнт на строчке ErrorCode := 0; (см. обработчик OnError)

?


 
Denizzz   (2006-10-25 14:59) [25]

да, так и есть


 
Сергей М. ©   (2006-10-25 15:00) [26]

Если так то шланг - на месте.
Либо ты врешь, утверждая  что условия в [24] истинны.


 
Орион ©   (2006-10-25 15:07) [27]

а зачем пихать шланг в сетевуху, а потом его выдергивать?))


 
Сергей М. ©   (2006-10-25 15:11) [28]


> Орион ©   (25.10.06 15:07) [27]
> а зачем


> пихать .. потом .. выдергивать


Как это "зачем" ?!

Приятно) .. же) ... "туда-сюда-обратно"))


 
Denizz   (2006-10-25 19:20) [29]

Да ну вас!
причем прогу пишу  не для себя, друг попросил. Все в ней ОК, но только этот косяк и мешает (можно назавть это краш-тестом). реально такой ситуации не было. Шланги никто не выдергивает.
Охота, чтоб программа была на все готова.


 
Anatoly Podgoretsky ©   (2006-10-25 19:24) [30]

Да какой же это ОК


 
Сергей М. ©   (2006-10-26 09:12) [31]


> Denizz   (25.10.06 19:20) [29]


> Охота, чтоб программа была на все готова


Благое желание, прекрасно его понимаю.

Но и ты пойми, что "выдергивание шланга" у партнера в момент исполнения метода приема/передачи обязано привести либо к немедленному возбуждению исключения либо к возникновению не позднее чем через некоторое время после успешного завершения исполнения метода (оно небольшое, определяется некоторыми системными параметрами) события OnError c соотв.кодом ошибки. И если ни то ни другое у тебя не произошло, то это означает, что со "шлангом" все в порядке.


 
Falcao   (2006-10-26 11:36) [32]

Мдааа =)))) Невероятное что-то. Может прсто это компоненты такие?
АПИ еще не подводил, Denizz попробуй вот так:
//подключи winsock
WSADATA wsaData;
 SOCKET sock = 0;
 struct sockaddr_in sad;

if ( WSAStartup(MAKEWORD(1,1), &wsaData))
   ShowMessage("ошибка подгрузки WinSock");

 sad.sin_family = AF_INET;
 sad.sin_port = htons(5550);

 sad.sin_addr.s_addr = inet_addr("10.0.0.2");//или любой dest-IP, для теста, что в сети
 memset(&(sad.sin_zero), "\0", 8);

 sock = socket(AF_INET , SOCK_STREAM, 0);
 if (!sock)
     ShowMessage("Ошибка создания сокета");
 int sa;
 sa = sizeof(struct sockaddr);
 if (connect( sock,
              (struct sockaddr *)&sad,
              sizeof(struct sockaddr))==-1)
       ShowMessage("Нет контакта.");
    else
       ShowMessage("Есть контакт!");
 closesocket(sock);

А что мешает устроить пынг? Можно гейтвей(или кой-нить сервер в ЛС) для верности пинговать.


 
Сергей М. ©   (2006-10-26 11:55) [33]


> Falcao   (26.10.06 11:36) [32]



> Может прсто это компоненты такие?


Нормальные компоненты.


> что мешает устроить пынг?


Это еще зачем ?)

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


 
Falcao   (2006-10-26 12:05) [34]

На счет компонентов не утверждаю, ибо не работал с емя.
На счет гонцов - я так понял, что человек хочет "поймать" момент выхода из сети. В случае отправки (постоянной) пакетов, ака отправка файлов, естественно, что ни каких гонцов посылать не надо.


 
Сергей М. ©   (2006-10-26 12:08) [35]


> Falcao   (26.10.06 12:05) [34]


Ну так на то и таймер у автора)


 
Denizzz   (2006-10-26 14:08) [36]

В общем если убиваю процесс на том конце срабатывает чекпойнт на OnError, если выдергиваю шланг - не срабатывает даже после минуты ожидания хотя событие:
procedure TForm1.TimerTestTimer(Sender: TObject);
begin
 ClientSocket1.Socket.SendText(".");
end;

выполняется каждые пять секунд


 
Denizzz   (2006-10-26 14:09) [37]

после слова "конце" - запятая


 
Сергей М. ©   (2006-10-26 14:11) [38]


> не срабатывает даже после минуты ожидания


Значит ты его (отказа в том или ином виде) попросту не дождался.


 
Denizzz   (2006-10-26 14:17) [39]


> Значит ты его (отказа в том или ином виде) попросту не дождался.

См. (37) - за минуту это условие выполняется 12 раз!
И еще одна закономерность выявилась. Ошибка срабатывает если шланг выдернул у себя, а если на том конце его дергаешь ничего не срабатывает.


 
Сергей М. ©   (2006-10-26 14:46) [40]


> Ошибка срабатывает если шланг выдернул у себя, а если на
> том конце его дергаешь ничего не срабатывает


Советую внимательно изучить TCP-циклограмму.
см., например, http://book.itep.ru, раздел "Протокол ТСР"


 
Eraser ©   (2006-10-27 02:08) [41]

> [39] Denizzz   (26.10.06 14:17)

это потому что, при выдергивании шланга у себя - система об этом сразу же узнает и уведомляет стек TCP/IP.


 
hustler   (2006-12-21 00:08) [42]

Дык вроде если у серва выдернуть шланг, то у клинта должно произойти событие OnDisconnect, а не OnError? а ошибки 10061 и 10053 возбуждаются при соединении, а не передаче данных?
З.Ы. Я сам недавно начал работать с сетью, так что это тока мое предположение)


 
Сергей М. ©   (2006-12-21 08:19) [43]


> hustler   (21.12.06 00:08) [42]


> если у серва выдернуть шланг, то у клинта должно произойти
> событие OnDisconnect


Нет, не должно.


> ошибки 10061 и 10053 возбуждаются при соединении, а не передаче
> данных


10061 - при соединении, 10053 - при приеме/передаче


 
Anatoly Podgoretsky ©   (2006-12-21 12:31) [44]

> Сергей М.  (21.12.2006 8:19:43)  [43]

Он наверно расчитывает, что отсоединеный сервер/клиент смогут передать событие отсоединения по несуществующему в данный момент каналу связи.


 
Сергей М. ©   (2006-12-21 12:45) [45]


> Anatoly Podgoretsky ©   (21.12.06 12:31) [44]


Угу.

Как в том анекдоте:

Мойша: - Я только что умер, срочно передайте Рабиновичу, что десятку, которую он занял у меня вчера и обещал отдать завтра, я ему таки прощаю


 
Дмитрий Белькевич ©   (2006-12-21 13:44) [46]

>И еще одна закономерность выявилась. Ошибка срабатывает если шланг выдернул у себя, а если на том конце его дергаешь ничего не срабатывает.

Компы, я так понимаю, через хаб/свич соединены, что ж удивляться, что ничего не срабатывает? Соединение с хабом то физически есть, а то, что удалёенное оборвано, хаб никому не сообщит.



Страницы: 1 2 вся ветка

Текущий архив: 2007.07.29;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.02 c
2-1183293624
fuzzy
2007-07-01 16:40
2007.07.29
Создание SQL запроса.


15-1183153749
Riply
2007-06-30 01:49
2007.07.29
Что-то пустынно стало на форуме


2-1183698279
Vasyl
2007-07-06 09:04
2007.07.29
Удаления из програмы


15-1182924454
NailMan
2007-06-27 10:07
2007.07.29
Время наработки на отказ?


2-1183559033
Реактор
2007-07-04 18:23
2007.07.29
Проблема Read Write