Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.011 c
3-82125
Alex_x
2003-09-04 11:29
2003.09.25
После отлавливания ошибки в запросе ADO глючит


3-82113
LeSS
2003-09-04 16:41
2003.09.25
Нужно создать таблицу dbf


1-82318
pvb87@mail.ru
2003-09-12 17:44
2003.09.25
Манипулятор окна


1-82229
Doid
2003-09-12 14:22
2003.09.25
WindowProc для TToolButton


1-82269
Sam Stone
2003-09-15 17:40
2003.09.25
FocusedNode





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский