![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
connect function
clim © (2003-07-23 00:20:00)у меня такой вопрос:
значит когда я устонавливаю соединение с каким-либо хостом на определенный порт,
то если таковой порт закрыт - очень долго генерирутся ошибка, что порт закрыт,
я написал такой код
...
A.sin_family:=AF_INET;
A.sin_addr.S_addr:=inet_addr(pchar(ip));
A.sin_port:=htons(port_number);
S:=socket(AF_INET,SOCK_STREAM,0);
port := false;
starttime:=GetCurrentTime();
while (GetCurrentTime() - starttime < wait_for_response) do
begin
if connect(S,A,sizeof(A))=0 then
port := true;
end;
if port=true then
Memo1.Lines.add(inttostr(port_number)+" -> open")
else
( inttostr(port_number)у меня такой вопрос:
значит когда я устонавливаю соединение с каким-либо хостом на определенный порт,
то если таковой порт закрыт - очень долго генерирутся ошибка, что порт закрыт,
я написал такой код
...
A.sin_family:=AF_INET;
A.sin_addr.S_addr:=inet_addr(pchar(ip));
A.sin_port:=htons(port_number);
S:=socket(AF_INET,SOCK_STREAM,0);
port := false;
starttime:=GetCurrentTime();
while (GetCurrentTime() - starttime < wait_for_response) do
begin
if connect(S,A,sizeof(A))=0 then
port := true;
end;
if port=true then
Memo1.Lines.add(inttostr(port_number)+" -> open")
else
Memo1.Lines.add(inttostr(port_number)+" -> close");
...
но ошибка все равно долго обрабатывается
Что делать???
Digitman (2003-07-28 08:13:00) [1]
и брейка в теле цикла нет) ... тоже заметил только что
Polevi (2003-07-27 19:55:00) [2]
>вот я и спрашиваю, как мне можно определить несуществующий порт
>с такой же скоростью, с какой определяю существующий
порт никак, можно сначала выполнить ping на предмет существования хоста, если есть - попробовать установить соединение
Morfein (2003-07-27 18:43:00) [3]
А я бы не так сказал. Вся толпа остаётся на пороге, и ждёт, когда их пригласят внутрь. А внутрь их всех не пригласят либо потому что таймаут для запросов на соединение от большинства наступил, либо потому что лимит соединений с одного адреса не позволяет эту толпу целиком впустить.
nikus (2003-07-26 20:44:00) [4]
2Verg
аналогия с соседом - он открывает дверь, а на пороге стоит чувак и глядя на секундомер продолжает нажимать звонок положеные еще секунд -цать:))))
А я бы сказал: бедный сосед открывает дверь и смотрит, как толпы чуваков вбегают в его квартиру, и никто не выходит, в течение ...дцати секунд :).
ЗЫ Потому как дисконнекта нет...
Verg (2003-07-26 18:09:00) [5]
> Да вы приглядитесь внимательнее, что в указанном фрагменте
> в цикле происходит.
Устанавливается соединение в течение wait_for_response времени.
По истечению wait_for_response, если соединение было установлено, то... в общем пишем одно, иначе пишем другое.
Когда соединение не устанавливается, то цикл заканчивается через время намного, видимо, превышающее wait_for_response.
Что и вызывает недоумение/неудовольствие:
> но ошибка все равно долго обрабатывается
Правда и удачное (быстрое) соединение не уменьшает времени выполнения данного цикла (хош-не хош, соединение-не соединение, а wait_for_response времени долбимся в открытую дверь, прикинь - аналогия с соседом - он открывает дверь, а на пороге стоит чувак и глядя на секундомер продолжает нажимать звонок положеные еще секунд -цать:)))) но... это уже другой вопрос :))
Alex Konshin (2003-07-26 13:00:00) [6]
Да вы приглядитесь внимательнее, что в указанном фрагменте в цикле происходит.
Digitman (2003-07-25 08:32:00) [7]
> Verg
эк ты в дебри-то полез)
автор тут, видишь ли, на winsockAPI код "ваяет") круче как бы уже некуда)
и ничего, видимо, не представляя про существование асинхронного режима)
а ты ему - про какой-то ClientSocket))))
Verg (2003-07-24 18:31:00) [8]
Ну тык, и ограничивай свойтайм-лимит:
Говоришь ClinetSockt1.Active:=true;
Он тебе говорит - "Ок, понял, начинаю" - OnConnecting;
на что ты заводишь таймер Timer1.Enabled:=true;
Где OnTimer1Timer (нет связи) Делаешь ClientSocket1.Socket.Close;
На все остальные события Timer1.Enabled:=false;
В чем трабл-то?
Я тебе модель дал - ну хочешь ты считать, что никого нет дома, если через секунду после звонка дверь не открыли - твое право.
Или тебе не хочется верить, что TCP/IP - это протокол БЕЗ гарантированного времени доставки?
Однако так оно и есть на самом деле....
Digitman (2003-07-24 17:37:00) [9]
> clim
умник !) а если ты ограничишь тайм-лимитом время ожидания ACK или RST, а коннект к заведомо активному порту чуть превысит это время ? по каким-то объективным причинам ? буквально - на доли секунды ? тогда что ?)
clim (2003-07-24 17:15:00) [10]
именно про тайм лимит, я и спрашивал, ничего больше
не следует тут пальцы кидать
2Rouse_ спасибо
Rouse_ (2003-07-24 15:27:00) [11]
Используйте таймлимит, в компонентах это реализовано.
Желаю успехов
Digitman (2003-07-24 14:58:00) [12]
> Verg
Замечательная, кстати говоря, ассоциация !))
Про сортир я вот как то и не дотумкал сравнение привести)
Дай бог на пользу автору сабжа !
Verg (2003-07-24 14:54:00) [13]
Вот ты когда звонишь в дверь к соседу, то как тебе мнгновенно определить, что его нет дома?
Нет ведь, ты звонишь раз, слушаешь нет ли шагов, ждешь таймаут, звонишь второй раз, снова ждешь-слушаешь....
Т.е. если сосед не открыл дверь сразу же - это вовсе ведь не значит, что его нет дома... Мож он просто, пардон, в сортире завис по известным причинам :)
Digitman (2003-07-24 08:23:00) [14]
> как мне можно определить несуществующий порт с такой же
> скоростью, с какой определяю существующий
никак.
clim (2003-07-23 23:42:00) [15]
объясняю еще раз:
когда я коннекчусь на существующий порт - эта операция занимает от 1 до 3(максимум) секунд
но, когда пытаюсь законнектиться на несуществующий -- результат удручающий, т.е. приходится ждать от 40 до 60 секунд, хотя в общем-то всегда 50
вот я и спрашиваю, как мне можно определить несуществующий порт с такой же скоростью, с какой определяю существующий
к тому с чего вы взяли что я спецификаций не знаю, это я вам с таким же успехом могу предложить: читай rfc1-2000
nikus (2003-07-23 21:28:00) [16]
clim> слушай я смотрел их исходники, и нисего такого не замечал,
Плохо смотрел значит
clim> все дело в том что это си а дельфи
И что, TCP/IP для Си и Делфи работает по-разному? Тебе ж сказали - читай описание протокола TCP/IP, и тогда ты поймёшь, ПОЧЕМУ ответ идёт долго.
clim (2003-07-23 20:57:00) [17]
2nikus
слушай я смотрел их исходники, и нисего такого не замечал,
все дело в том что это си а дельфи
nikus (2003-07-23 20:26:00) [18]
2clim
www.google.ru
"Описание протокола TCP/IP"
Изучай =)
А применительно к "если сравнивать со скоростью, с которой сканируют порты, такие программки как nmap, portscanner, то скорость очень низкая =("скажу, что эти проги создают несколько десятков/сотен сокетов, каждый из которых коннектиться одновременно.
Попингуй любой хост - установление коннекта будет идти не меньше.
clim (2003-07-23 18:58:00) [19]
> digitman
я про сервак имел в виду- для меня ничего не завичит
где почитать???
Digitman (2003-07-23 15:51:00) [20]
> clim
> от сервака ничего не завист!!!
зависит ! еще как зависит !
и от "сервака", и от способа/интерфейса доступа в сеть провайдера, и от маршрута... много от чего зависит !
читай все про протоколы IP и TCP/IP