Главная страница
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, раздел "Протокол ТСР"



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

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

Наверх




Память: 0.56 MB
Время: 0.018 c
2-1182952331
prMan
2007-06-27 17:52
2007.07.29
прогрессбар


15-1183099714
hgd
2007-06-29 10:48
2007.07.29
Алгоритм Magic wand


1-1179760981
TStas
2007-05-21 19:23
2007.07.29
Что нужно писать в rs файле, чтобы засунуть звук в ресурс?


15-1183108690
Volcanic
2007-06-29 13:18
2007.07.29
Как объединить TreeView и ListView??


11-1166279345
NeeDiGeo
2006-12-16 17:29
2007.07.29
Добавление формы в уже существующий проект KOL_MCK