Текущий архив: 2004.09.19;
Скачать: CL | DM;
Вниз
Блин... запарился два дня уже не могу сделать Найти похожие ветки
← →
Гость (2004-09-02 12:30) [0]Напишите пожайлуста порядок действий с TClientSocket что он все время пытася подключится к серверу 192,168,0,100 port 6666 и не вадавал ошибки что буфер переполнен
Пожайдуста ,С уважением...
← →
VID © (2004-09-02 12:50) [1]Тебе уже говорили что надо обрабатывать OnError.
В обработчике пиши
ErrorCode := 0;
Socket.Close;
← →
Гость (2004-09-02 13:17) [2]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ScktComp;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Open;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Timer1.Enabled:=False;
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close;
Timer1.Enabled:=True;
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Timer1.Enabled:=True;
end;
end.
Теперь вообще к серверу не подключается если сервер был запущен после клиента ,память все равно жрет но намного медленнее интервал таймера =1000 мс
????
← →
Digitman © (2004-09-02 13:18) [3]
> Гость (02.09.04 12:30)
тебе здесь
http://delphimaster.net/view/14-1094044391/
все уже разжевали !
что непонятного ? разницу между Socket.Сlose и ClientSocket1.Close в обработчике OnError() не замечаешь ? разные же объекты !!
← →
Гость (2004-09-02 13:23) [4]Digitman © (02.09.04 13:18) [3]
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close;
Timer1.Enabled:=True;
end;
Теперь вообще к серверу не подключается если сервер был запущен после клиента ,память все равно жрет но намного медленнее интервал таймера =1000 мс
????
← →
Мюмзик в мове (2004-09-02 13:33) [5]возьми стандартный пример, если глючит, значит все плохо
← →
Гость (2004-09-02 13:45) [6]нету у меня примеров по сокетам в д7
Люююди пожайлуста напишите мне как ЭТО сделать иначе через час мне уже поможет только психушка
← →
VID © (2004-09-02 13:46) [7]делай так
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False; //И не спрашивай почему :)
if ClientSocket1.Active then exit;
ClientSocket1.Open;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
здесь с таймером ничего не нужно делать
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close;
//Timer1.Enabled := true; Раскоментируй эту строчку только если таймер не активизируется после первой неудачной попытки коннеткта. Хотя по идее эта строчка не нужна вообще то ...
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Timer1.Enabled:=True;
end;
← →
Digitman © (2004-09-02 14:08) [8]можно и так (в предположении что св-ва Host и/или Service заведомо корректны):
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//стартуем механизм коннекта с асинхр.нотификацией о событиях
ClientSocket1.Open;
end;
procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
//это событие будет возбуждено немедленно и безусловно после успешного СТАРТА механизма коннекта
Timer1.Enabled := False; //выключим таймер, пока ничего не известно о результатах попытки коннекта, он нам не нужен
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
//возникло событие отказа коннекта по каким-то причинам - в дан.случае нам безразлично каким - мы уверены что Host корректен
ErrorCode:=0; //предотвращаем вывод окна с сообщением об отказе коннекта
Socket.Close;
Timer1.Enabled := true;
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//только если нужен автоРЕконнект после дисконнекта сервера по его инициативе !!
Timer1.Enabled:=True; //через 1 сек будет возбуждено событие OnTimer
end;
← →
VID © (2004-09-02 15:21) [9]Digitman © (02.09.04 14:08) [8]
У меня вопрос небольшой...
Я вот в своём примере написал так
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close;
//Timer1.Enabled := true; Раскоментируй эту строчку только если таймер не активизируется после первой неудачной попытки коннеткта. Хотя по идее эта строчка не нужна вообще то ...
end;
Т.е. Timer1.Enabled := True я считаю ненужным, потому что вызов Socket.Close, как мне кажется автоматически вызовет Clientsocket1.OnDisconnect, а там у нас произойдёт включение таймера.
Т.е. с моей т.з. в примере, приведённом тобою, плучается что в OnError сначал будет закрыт сокет (а там уже включится таймер), а потом следующей строчкой в OnError будет предпринята ещё одна попытка включения таймера.
Как мне кажется если в OnError стоит безусловный вызов Socket.Close то событие OnDisconnect всегда будет инициировано после вызова Socket.Close в обработчике OnError.
Вопрос такой: я прав или нет ? Если нет, то почему ?
← →
Digitman © (2004-09-02 16:33) [10]
> VID © (02.09.04 15:21) [9]
да вариантов-то - куча
важно поредставлять себе последовательность возбуждения событий в том либо ином случае
Страницы: 1 вся ветка
Текущий архив: 2004.09.19;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.056 c