Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.25;
Скачать: CL | DM;

Вниз

connect function   Найти похожие ветки 

 
clim   (2003-07-23 00:20) [0]

у меня такой вопрос:
значит когда я устонавливаю соединение с каким-либо хостом на определенный порт,
то если таковой порт закрыт - очень долго генерирутся ошибка, что порт закрыт,
я написал такой код
...
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-23 08:35) [1]


> долго обрабатывается


"долго" это сколько ? и сколько, по твоему, д.б. "недолго" ?


 
clim   (2003-07-23 14:59) [2]

примерно 5-7 секунд
нужно чтобы около 1, максимум 2


 
Digitman ©   (2003-07-23 15:16) [3]


> clim


что значит "нужно" ? мало ли чего тебе нужно ! сервер может быть на другом конце света, сервер может быть нагружен до предела - мало ли причин, по которым реакция на твой запрос не мгновенна ?
обратись к серверу на твоей же (локальной) машине - будет тебе реакция в доли секунды !


 
clim   (2003-07-23 15:43) [4]

хотя нет -- я ошибся, чтобы определить состояние одного порта этому кусочку кода треюуется 50 секунд.
к стати очень хорошо заметно, что интенсивность хождения пакетов во
время этого кода очень низкая.
если сравнивать со скоростью, с которой сканируют порты, такие программки как nmap, portscanner, то скорость очень низкая =(

от сервака ничего не завист!!!


 
Е-моё имя ©   (2003-07-23 15:45) [5]

clim (23.07.03 15:43)

почитай про установление TCP соединения и сразу все поймешь


 
Digitman ©   (2003-07-23 15:51) [6]


> clim



> от сервака ничего не завист!!!


зависит ! еще как зависит !
и от "сервака", и от способа/интерфейса доступа в сеть провайдера, и от маршрута... много от чего зависит !

читай все про протоколы IP и TCP/IP


 
clim   (2003-07-23 18:58) [7]

> digitman
я про сервак имел в виду- для меня ничего не завичит

где почитать???


 
nikus ©   (2003-07-23 20:26) [8]

2clim
www.google.ru
"Описание протокола TCP/IP"
Изучай =)

А применительно к "если сравнивать со скоростью, с которой сканируют порты, такие программки как nmap, portscanner, то скорость очень низкая =(" скажу, что эти проги создают несколько десятков/сотен сокетов, каждый из которых коннектиться одновременно.
Попингуй любой хост - установление коннекта будет идти не меньше.


 
clim   (2003-07-23 20:57) [9]

2nikus
слушай я смотрел их исходники, и нисего такого не замечал,
все дело в том что это си а дельфи


 
nikus ©   (2003-07-23 21:28) [10]


clim> слушай я смотрел их исходники, и нисего такого не замечал,

Плохо смотрел значит


clim> все дело в том что это си а дельфи

И что, TCP/IP для Си и Делфи работает по-разному? Тебе ж сказали - читай описание протокола TCP/IP, и тогда ты поймёшь, ПОЧЕМУ ответ идёт долго.


 
clim   (2003-07-23 23:42) [11]

объясняю еще раз:
когда я коннекчусь на существующий порт - эта операция занимает от 1 до 3(максимум) секунд
но, когда пытаюсь законнектиться на несуществующий -- результат удручающий, т.е. приходится ждать от 40 до 60 секунд, хотя в общем-то всегда 50

вот я и спрашиваю, как мне можно определить несуществующий порт с такой же скоростью, с какой определяю существующий

к тому с чего вы взяли что я спецификаций не знаю, это я вам с таким же успехом могу предложить: читай rfc1-2000


 
Digitman ©   (2003-07-24 08:23) [12]


> как мне можно определить несуществующий порт с такой же
> скоростью, с какой определяю существующий


никак.


 
Verg ©   (2003-07-24 14:54) [13]

Вот ты когда звонишь в дверь к соседу, то как тебе мнгновенно определить, что его нет дома?
Нет ведь, ты звонишь раз, слушаешь нет ли шагов, ждешь таймаут, звонишь второй раз, снова ждешь-слушаешь....
Т.е. если сосед не открыл дверь сразу же - это вовсе ведь не значит, что его нет дома... Мож он просто, пардон, в сортире завис по известным причинам :)


 
Digitman ©   (2003-07-24 14:58) [14]


> Verg


Замечательная, кстати говоря, ассоциация !))

Про сортир я вот как то и не дотумкал сравнение привести)

Дай бог на пользу автору сабжа !


 
Rouse_ ©   (2003-07-24 15:27) [15]

Используйте таймлимит, в компонентах это реализовано.

Желаю успехов


 
clim   (2003-07-24 17:15) [16]

именно про тайм лимит, я и спрашивал, ничего больше
не следует тут пальцы кидать



2Rouse_ спасибо


 
Digitman ©   (2003-07-24 17:37) [17]


> clim


умник !) а если ты ограничишь тайм-лимитом время ожидания ACK или RST, а коннект к заведомо активному порту чуть превысит это время ? по каким-то объективным причинам ? буквально - на доли секунды ? тогда что ?)


 
Verg ©   (2003-07-24 18:31) [18]

Ну тык, и ограничивай свой тайм-лимит:

Говоришь ClinetSockt1.Active:=true;
Он тебе говорит - "Ок, понял, начинаю" - OnConnecting;
на что ты заводишь таймер Timer1.Enabled:=true;
Где OnTimer1Timer (нет связи) Делаешь ClientSocket1.Socket.Close;
На все остальные события Timer1.Enabled:=false;

В чем трабл-то?
Я тебе модель дал - ну хочешь ты считать, что никого нет дома, если через секунду после звонка дверь не открыли - твое право.
Или тебе не хочется верить, что TCP/IP - это протокол БЕЗ гарантированного времени доставки?
Однако так оно и есть на самом деле....


 
Digitman ©   (2003-07-25 08:32) [19]


> Verg


эк ты в дебри-то полез)
автор тут, видишь ли, на winsockAPI код "ваяет") круче как бы уже некуда)
и ничего, видимо, не представляя про существование асинхронного режима)
а ты ему - про какой-то ClientSocket))))


 
Alex Konshin ©   (2003-07-26 13:00) [20]

Да вы приглядитесь внимательнее, что в указанном фрагменте в цикле происходит.


 
Verg ©   (2003-07-26 18:09) [21]


> Да вы приглядитесь внимательнее, что в указанном фрагменте
> в цикле происходит.


Устанавливается соединение в течение wait_for_response времени.
По истечению wait_for_response, если соединение было установлено, то... в общем пишем одно, иначе пишем другое.

Когда соединение не устанавливается, то цикл заканчивается через время намного, видимо, превышающее wait_for_response.
Что и вызывает недоумение/неудовольствие:

> но ошибка все равно долго обрабатывается


Правда и удачное (быстрое) соединение не уменьшает времени выполнения данного цикла (хош-не хош, соединение-не соединение, а wait_for_response времени долбимся в открытую дверь, прикинь - аналогия с соседом - он открывает дверь, а на пороге стоит чувак и глядя на секундомер продолжает нажимать звонок положеные еще секунд -цать:)))) но... это уже другой вопрос :))


 
nikus ©   (2003-07-26 20:44) [22]

2Verg
аналогия с соседом - он открывает дверь, а на пороге стоит чувак и глядя на секундомер продолжает нажимать звонок положеные еще секунд -цать:))))

А я бы сказал: бедный сосед открывает дверь и смотрит, как толпы чуваков вбегают в его квартиру, и никто не выходит, в течение ...дцати секунд :).

ЗЫ Потому как дисконнекта нет...


 
Morfein ©   (2003-07-27 18:43) [23]

А я бы не так сказал. Вся толпа остаётся на пороге, и ждёт, когда их пригласят внутрь. А внутрь их всех не пригласят либо потому что таймаут для запросов на соединение от большинства наступил, либо потому что лимит соединений с одного адреса не позволяет эту толпу целиком впустить.


 
Polevi ©   (2003-07-27 19:55) [24]

>вот я и спрашиваю, как мне можно определить несуществующий порт
>с такой же скоростью, с какой определяю существующий

порт никак, можно сначала выполнить ping на предмет существования хоста, если есть - попробовать установить соединение


 
Digitman ©   (2003-07-28 08:13) [25]

и брейка в теле цикла нет) ... тоже заметил только что



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

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

Наверх




Память: 0.53 MB
Время: 0.037 c
1-82266
A-DiL
2003-09-14 17:53
2003.09.25
Метод итераций : помогите найти вспомогательную функцию


4-82567
YY
2003-07-21 22:53
2003.09.25
Transparent icons and Active Desktop


3-82126
Ury
2003-09-04 13:54
2003.09.25
DBComboBox


14-82495
Verg
2003-09-05 14:54
2003.09.25
Поиск на этом сайте и в частности по форумам.


14-82439
Некрофил-затейник__
2003-09-08 09:01
2003.09.25
Человеки помогите найти!