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

Вниз

Ну помогите же ПЛЗ..... !!!!!   Найти похожие ветки 

 
DP   (2002-03-27 08:02) [0]

Мастера помогите....
Долго мучаюсь над этой прогой!!!
Смысл в том, что на 1122 порту висит Server
который при подключении к нему выдает приветственное сообщение...Типа "Hello World!";
Имеется мой сканер компьютеров который ищет его, в нем и проблем..
Вот код сканера:

( cln: TClientSocket;)


for i:=strtoint(beg.Text) to strtoint(ed.Text) do
begin
cln.Host:=(edit1.Text+"."+edit2.Text+"."+edit3.Text+"."+inttostr(i));
cln.Active:=true;
memo1.Lines.Add("On "+cln.Host+" --> "+rt);
cln.Active:=false;
end;
end;

Она сервер находит только после второго нажатия, а после первого выдает
что ничего не найдено, а после второго находит!!!
Но после этого, он выдает приветствие в любом случае даже если сервера
уже и нет, да и на любом компьютере выдает!!!!!!!!!!!!!!

АХ ДА !!

procedure TForm1.clnError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
errorcode:=0;
end;

procedure TForm1.clnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
rt:=cln.Socket.ReceiveText;
end;


 
Adder   (2002-03-27 08:19) [1]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017118319&n=4 ?! :(


 
YP   (2002-03-27 11:34) [2]

1 путь. (медленная проверка). На форму, кроме Cln ставим TTimer (время ожидания соединения и ответа сервера).
ScanButtonClick:
i := strtoint(beg.Text);
cln.Host:=(edit1.Text+"."+edit2.Text+"."+edit3.Text+"."+inttostr(i)); //i - описана вне данной процедуры
cln.Open;
Timer.Enabled := true;

ClnRead:
rt := ...;
Memo1...Add(...rt...);//Текст может прийти не сразу весь => продумать правильный перенос строк в Memo1

ClnError: (Соединение не удалось)
ErrorCode := 0;
Timer.Enabled := false;
Cln.Close;
NextHost;

TimerTimer:
Timer.Enabled := false;
Cln.Close;
NextHost;

procedure NextHost;
begin
inc(i);
if i > StrToInt(Ed.Text) then Memo1...Add("Сканирование завершено")
else
begin
cln.Host:= (edit1.Text+"."+edit2.Text+"."+edit3.Text+"."+inttostr(i));
cln.Open;
Timer.Enabled := true;
end;
end;

Может быть что-то напутал (компилить не пробовал), но идея такая.

2 путь - использовать несколько ClientSocket и соотв. таймеров, как сделано во всех приличных сканерах. (работать будет быстрее в количество сокетов раз).


 
Vogul   (2002-03-27 11:57) [3]

А не проще ли использовать для поиска сервера broadcast-ы


 
YP   (2002-03-27 12:02) [4]

Вообще-то броадкаст работает на уровне ip. А на tcp никаких броадкастов нет ;)


 
Vogul   (2002-03-27 12:09) [5]

Для поиска какая разница, хоть SNMP.


 
YP   (2002-03-27 12:15) [6]

С номером порта (1122) и со строкой (Hell World) как быть, SNMP?


 
Vogul   (2002-03-27 12:38) [7]

Я имел ввиду, что для поиска сервера неважно по какому протоколу это будет происходить. Можно в сервер встроить SNMP агент, который будет возращать клиенту IP адресс сервера.
А в данном случае надо определиться, если в сети 3 компьютера, то перебор наиболее простой способ поиска сервера. А если 100?
Тогда придеться долго ждать. Если задача состоит только в "Hello world!", то мне кажется, лучше всего подходят броадкасты.
Клиент посылает в сеть броадкаст и ждет ответа от сервера.
Сервер, получив броадкаст отсылает клиенту, либо сразу строку(если это все, что от него требуется), либо устанавливает с ним соединение с последующим обменом информацией.


 
YP   (2002-03-27 12:59) [8]

Вот теперь понятно. Подход правильный, если можно переписать сервер. Я исходил из того, что сервер - константа, а требуется соорудить поисковик такого сервера.


 
DP   (2002-03-28 07:42) [9]

Спасибо всем!!!
Особенно YP!!

To Adder> Я видел ваш ответ, но он мне не помог, даже потому, что где я возьму обработчик onclientconnect у клиента!!!


 
Donal_Graeme   (2002-03-28 13:22) [10]

а мне кажется всё гораздо проще.

ScanDone : Boolean;

For I:=
..
ScanDone := False;
cln.active:= true;
repeat until ScanDone; //ждём результата
memo1.Lines.Add("On "+cln.Host+" --> "+rt);
cln.Active:=false;
..

{clnerror}
rt := "not respond";
ScanDone := True;
errorcode := 0;

{clnread}
rt:=cln.Socket.ReceiveText;
ScanDone := True;

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


 
DP   (2002-03-29 07:56) [11]

Спасибо, Но вопрос !!!!
Клиент находит сервер и шлёт "Hello World"
тут я сервер закрывая , сканирую, он опять шлет "hello world"


 
panov   (2002-03-29 09:33) [12]

>DP © (29.03.02 07:56)
Тебе же дали правильный ответ(Adder © (27.03.02 08:19))


 
Donal_Graeme   (2002-03-29 09:59) [13]

2 Panov:
а вы уверены, что правильно поняли вопрос?
OnClientConnect - это событие ServerSocket, а серверную часть, насколько я понял, по условию задачи менять нельзя. Кроме того, исходя из условий задачи, на сервере уже реализован обработчик OnClientConnect, и в этом обработчике шлётся сообщение клиенту.
Наша задача поймать это сообщение, если сервер работает.


 
Donal_Graeme   (2002-03-29 10:26) [14]

2 DP :

хм...извиняюсь за ошибку, надо было вот так :


For I:=
..
ScanDone := False;
cln.active:= true;
repeat
Application.ProcessMessages;
until ScanDone; //ждём результата
memo1.Lines.Add("On "+cln.Host+" --> "+rt);
cln.Active:=false;
..


я у себя попробовал твой вариант и свой, тот что я тебе написал.
так вот, твой работает как ты и говорил, а мой у меня работает правильно.
объясню, в чём у тебя ошибка. когда ты делаешь cln.Active := True, клиент только начинает коннектиться к серверу, он ещё не получил ничего, а ты уже выводишь текст (подчеркну, не дождавшись OnRead). Поэтому на первом проходе ты не получаешь результата. Клиент получает OnRead и текст уже потом, но до второго прохода. И на втором проходе ты видишь полученное на предыдущий коннект сообщение. Однако у тебя в коде я не заметил обнуления rt. Поэтому далее rt будет всегда содержать полученное с сервера сообщение.

Теперь отличие моего куска кода от твоего.
1) После cln.Active := true; у меня стоит цикл, который ждёт либо ошибки коннекта, либо получения сообщения (эти события индицируются переменной ScanDone)
2) На провал соединения переменной rt присваивается определённая строка на тот случай, если ранее был осуществлён успешный коннект.

Доработку программы для ситуации, когда к серверу удаётся подключиться, но он ничего не шлёт (в этом случае моя программа не завершит цикл сканирования), я оставляю тебе :-))


 
DP   (2002-03-29 18:18) [15]

Благодарю всех за помощь !!!!
;-))



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

Форум: "Сети";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
14-30971
herosofnn
2002-05-05 17:27
2002.06.10
Искусство программирования!!!


14-31002
Sergo
2002-05-08 08:42
2002.06.10
Бывает же :))


7-31031
Fredericco
2002-03-15 18:40
2002.06.10
Как работать с CreateFile() и др. я вроде бы разобрался. Но как проверить?


1-30828
Флип
2002-05-29 00:12
2002.06.10
Подскажите начинающему............


7-31029
pvn
2002-03-14 16:45
2002.06.10
CD-R(W)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский