![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket, ClientSocket и "выдергивание шланга из сетевухи" [D7, Win2k, WinXP]
Denizzz © (2006-10-25 12:51:00)Как отловить разрыв соединения при выдергивании шланга из сетевой платы (отказ свитча и т.п.)?
Проверял - событие OnClientError и OnError не происходит.
Дмитрий Белькевич (2006-12-21 13:44:00) [1]>И еще одна закономерность выявилась. Ошибка срабатывает если шланг выдернул у себя, а если на том конце его дергаешь ничего не срабатывает.
Компы, я так понимаю, через хаб/свич соединены, что ж удивляться, что ничего не срабатывает? Соединение с хабом то физически есть, а то, что удалёенное оборвано, хаб никому не сообщит.
Сергей М. (2006-12-21 12:45:00) [2]
> Anatoly Podgoretsky © (21.12.06 12:31) [44]
Угу.
Как в том анекдоте:
Мойша: - Я только что умер, срочно передайте Рабиновичу, что десятку, которую он занял у меня вчера и обещал отдать завтра, я ему таки прощаю
Anatoly Podgoretsky (2006-12-21 12:31:00) [3]> Сергей М. (21.12.2006 8:19:43) [43]
Он наверно расчитывает, что отсоединеный сервер/клиент смогут передать событие отсоединения по несуществующему в данный момент каналу связи.
Сергей М. (2006-12-21 08:19:00) [4]
> hustler (21.12.06 00:08) [42]
> если у серва выдернуть шланг, то у клинта должно произойти
> событие OnDisconnect
Нет, не должно.
> ошибки 10061 и 10053 возбуждаются при соединении, а не передаче
> данных
10061 - при соединении, 10053 - при приеме/передаче
hustler (2006-12-21 00:08:00) [5]Дык вроде если у серва выдернуть шланг, то у клинта должно произойти событие OnDisconnect, а не OnError? а ошибки 10061 и 10053 возбуждаются при соединении, а не передаче данных?
З.Ы. Я сам недавно начал работать с сетью, так что это тока мое предположение)
Eraser (2006-10-27 02:08:00) [6]> [39] Denizzz (26.10.06 14:17)
это потому что, при выдергивании шланга у себя - система об этом сразу же узнает и уведомляет стек TCP/IP.
Сергей М. (2006-10-26 14:46:00) [7]
> Ошибка срабатывает если шланг выдернул у себя, а если на
> том конце его дергаешь ничего не срабатывает
Советую внимательно изучить TCP-циклограмму.
см., например, http://book.itep.ru, раздел "Протокол ТСР"
Denizzz (2006-10-26 14:17:00) [8]
> Значит ты его (отказа в том или ином виде) попросту не дождался.
См. (37) - за минуту это условие выполняется 12 раз!
И еще одна закономерность выявилась. Ошибка срабатывает если шланг выдернул у себя, а если на том конце его дергаешь ничего не срабатывает.
Сергей М. (2006-10-26 14:11:00) [9]
> не срабатывает даже после минуты ожидания
Значит ты его (отказа в том или ином виде) попросту не дождался.
Denizzz (2006-10-26 14:09:00) [10]после слова "конце" - запятая
Denizzz (2006-10-26 14:08:00) [11]В общем если убиваю процесс на том конце срабатывает чекпойнт на OnError, если выдергиваю шланг - не срабатывает даже после минуты ожидания хотя событие:
procedure TForm1.TimerTestTimer(Sender: TObject);
begin
ClientSocket1.Socket.SendText('.');
end;
выполняется каждые пять секунд
Сергей М. (2006-10-26 12:08:00) [12]
> Falcao (26.10.06 12:05) [34]
Ну так на то и таймер у автора)
Falcao (2006-10-26 12:05:00) [13]На счет компонентов не утверждаю, ибо не работал с емя.
На счет гонцов - я так понял, что человек хочет "поймать" момент выхода из сети. В случае отправки (постоянной) пакетов, ака отправка файлов, естественно, что ни каких гонцов посылать не надо.
Сергей М. (2006-10-26 11:55:00) [14]
> Falcao (26.10.06 11:36) [32]
> Может прсто это компоненты такие?
Нормальные компоненты.
> что мешает устроить пынг?
Это еще зачем ?)
Я, к примеру, послал кому-то телеграмму с уведомлением о доставке, она движется к адресату с определенной "скоростью". Если адресат на момент доставки отсутствует, почтовая служба обязана меня об этом известить. Так вот ты сейчас предлагаешь мне все то время, пока телеграмма находится в пути, непрерывно посылать к адресату гонцов с целью выяснить, не умер ли он там, пока к нему идет моя телеграмма)
Falcao (2006-10-26 11:36:00) [15]Мдааа =)))) Невероятное что-то. Может прсто это компоненты такие?
АПИ еще не подводил, 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 09:12:00) [16]
> Denizz (25.10.06 19:20) [29]
> Охота, чтоб программа была на все готова
Благое желание, прекрасно его понимаю.
Но и ты пойми, что "выдергивание шланга" у партнера в момент исполнения метода приема/передачи обязанопривести либо к немедленному возбуждению исключения либо к возникновению не позднее чем через некоторое время после успешного завершения исполнения метода (оно небольшое, определяется некоторыми системными параметрами) события OnError c соотв.кодом ошибки. И если ни то ни другое у тебя не произошло, то это означает, что со "шлангом" все в порядке.
Anatoly Podgoretsky (2006-10-25 19:24:00) [17]Да какой же это ОК
Denizz (2006-10-25 19:20:00) [18]Да ну вас!
причем прогу пишу не для себя, друг попросил. Все в ней ОК, но только этот косяк и мешает (можно назавть это краш-тестом). реально такой ситуации не было. Шланги никто не выдергивает.
Охота, чтоб программа была на все готова.
Сергей М. (2006-10-25 15:11:00) [19]
> Орион © (25.10.06 15:07) [27]
> а зачем
> пихать .. потом .. выдергивать
Как это "зачем" ?!
Приятно) .. же) ... "туда-сюда-обратно"))
Орион (2006-10-25 15:07:00) [20]а зачем пихать шланг в сетевуху, а потом его выдергивать?))