Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в сети по диапазону адресов [D5, D6, Win2k]


Kair ©   (2004-05-04 06:28:00) 

procedure Button1Click();
var
 i: Integer;
begin
ListBox1.Clear;
for i := x to y do
 begin
  ClientSocket1.Address := zzz + IntToStr(i);
  ClientSocket1.Open;
 end;
end;

procedure ClientSocket1Connect();
begin
Socket.Close;
end;

procedure ServerSocket1Connect();
begin
ListBox1.Items.Add(Socket.RemoteAddress);
end;

procedure ListBox1DoubleClick();
begin
ClientSocket2.Address := ListBox1.Items[zzz]; //это другой, второй, сокет
end;

Но вот если найдет кого-нибудь, то больше поиск проводить не удается,
Выводится сообщение, что: "Can't change value while socket is active'"
и показывает на строку после "ClientSocket1.Address := ".
Пробовал делать в обработчике Button1Click так: ClientSocket1.Close;
Но ошибка все-равно выходит...
Сделал проверку на активность: ShowMessage(BooleToStr(ClientSocket1.Active));
Сначала показывает "0", а после соединения "-1".


FireMan_Alexey   (2004-05-05 10:45:00) [1]

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

Procedure Timer;
Begin
 Client.Address:="127.0.0.1";
 Client.Port:=3128;
 Client.Open;
 Timer.Enabled:=False;
End;

Procedure OnError;
Begin
 Socket.Disconnect(Socket.SocketHandle);
 Error:=0;
 Timer.Enabled:=True;
End;

Procedure OnConnect;
Begin
 Socket.Disconnect(Socket.SocketHandle);
 Timer.Enabled:=True;
End;


Наверх

Титульная страница Поиск, карта сайта Написать письмо