Форум: "Сети";
Текущий архив: 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 попробуй вот так:
//подключи winsockWSADATA 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.038 c