Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.061 c
2-1183633801
WhiteCat
2007-07-05 15:10
2007.07.29
Скрытые директории


15-1182859100
Predfer
2007-06-26 15:58
2007.07.29
Мышь PS/2 не работает


9-1157097994
Provodnick
2006-09-01 12:06
2007.07.29
Рисование координатной сетки


1-1179806262
pirate
2007-05-22 07:57
2007.07.29
Object2Stream


2-1183651575
Sergey_G
2007-07-05 20:06
2007.07.29
Сортировка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский