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

Вниз

Сокеты ERROR 10055, диплом горит   Найти похожие ветки 

 
ALeXiuS ©   (2003-06-05 13:34) [0]

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

Client.Active:=false; Client.Active:=true; на 240 попытке возникает ошибка сокета, мол очередь сокета забита
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ClientSocket1.Socket.Connected = false then
begin
ClientSocket1.Active:=false;
ClientSocket1.Active:=true;
end;
end;
Нужно чтобы клиент быстро определял Сервер активен или нет.
К примеру: Сервер работает, клиент установил с ним связь, но тут сервак падает, и не происходит события OnDisconnect, и необходимо отловить неактивность сервера.


 
Digitman ©   (2003-06-05 14:14) [1]

Timer1.Active := False; // начальное значение

...

делаем АСИНХРОННУЮ (!!!) попытку соединения

ClientSocket1.Open;

...


в обработчике OnError() :

ErrorCode := 0; // ошибка нас не интересует
Socket.Disconnect(Socket.SocketHandle); // освободим ресурсы
Timer1.Active := True; // стартуем таймер

в обработчике OnTimer() :

Timer1.Active := False; // останов таймера
ClientSocket1.Open; // повторяем попытку соединения





 
ALeXiuS ©   (2003-06-05 19:41) [2]

// CUT BEGIN=====================================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ScktComp, ToolWin, ComCtrls, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
StatusBar1: TStatusBar;
ClientSocket1: TClientSocket;
Timer1: TTimer;
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
Server:String;
ClientName:String;
public
{ Public declarations }
end;

var
Form1: TForm1;
i : integer =0;
j : integer =0;
implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
begin
Timer1.Enabled:=false;
Timer1.Interval:=5000;

if ClientSocket1.Active then ClientSocket1.Active:=false;
ClientSocket1.Address:="10.10.10.1";
ClientSocket1.Port:=1024;
ClientSocket1.ClientType:=ctNonBlocking;
ClientSocket1.Active:=true;

Timer1.Enabled:=true
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
with ClientSocket1 do
StatusBar1.Panels[0].Text := "Подсоединились к: " + Socket.RemoteHost +
" IP: " + Socket.RemoteAddress;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.add( Socket.ReceiveText );
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
inc(i);
Memo1.Lines.Add("Ошибка соединения: " + Server +" ERROR CODE :"+IntToStr(ErrorCode));
StatusBar1.Panels[0].Text := "Ошибка соединения по ERROR CODE " + IntToStr(i)+" раз...";
ErrorCode:=0;
{по совету Digitman"a}
ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.Handle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ClientSocket1.Socket.Connected = false then
begin
ClientSocket1.Close;
inc(j);
Memo1.Lines.Add("Ошибка соединения по времени , пробую "+IntToStr(j)+" раз...... ");
ClientSocket1.Open;
end;
end;
end.
// CUT END============================================
Сделал так и ничего не получается, в конечном итоге всегда вылетает 10055(An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.)
Может кто подскажет что надо сделать, что бы эта фигня работала...
Заранее огромное спасибо.


 
Digitman ©   (2003-06-06 08:20) [3]

procedure TForm1.Form Create(Sender: TObject);
begin
Timer1.Enabled:=false; // !!!!!!!!!!!!! установить в design-time
Timer1.Interval:=5000;

ClientSocket1.Active:=false; // !!!!!!!!!!!!! установить в design-time
ClientSocket1.Address:="10.10.10.1";
ClientSocket1.Port:=1024;
ClientSocket1.ClientType:=ctNonBlocking;
ClientSocket1.Active:=true;

end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
with ClientSocket1 do
StatusBar1.Panels[0].Text := "Подсоединились к: " + Socket.RemoteHost +
" IP: " + Socket.RemoteAddress;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.add( Socket.ReceiveText );
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
inc(i);
Memo1.Lines.Add("Ошибка соединения: " + Server +" ERROR CODE :"+IntToStr(ErrorCode));
StatusBar1.Panels[0].Text := "Ошибка соединения по ERROR CODE " + IntToStr(i)+" раз...";
ErrorCode:=0;
Socket.Disconnect(Socket.Handle);
Timer1.Enabled:=True; // !!!!!!!!!!!!! через заданный интервал таймер возобновит попытку соединения
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false; // отключим таймер
inc(j);
Memo1.Lines.Add("Ошибка соединения, пробую "+IntToStr(j)+" раз...... ");
ClientSocket1.Open;
end;



 
ALeXiuS ©   (2003-06-06 10:14) [4]

Это конечно хорошо но на 251 попытке соединения та же ошибка 10055


 
Digitman ©   (2003-06-06 10:23) [5]

миль пардон

Socket.Disconnect(Socket. SocketHandle);


 
ALeXiuS ©   (2003-06-06 13:06) [6]

Все РАБОТАЕТ!!!!!!!!!!!!!!
УРА!!!!!!
Огромное спасибо DIGITMAN"у



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
6-33251
Сергей_
2003-06-06 13:57
2003.08.11
отправка и прием файла по модему


7-33386
boa
2003-05-29 11:25
2003.08.11
Вопрос по TService


1-33191
TGrey
2003-07-28 22:37
2003.08.11
Позиционирование диалога открытия файла


4-33408
Школьник
2003-06-09 12:11
2003.08.11
Как корректно разместится в чужом адресном пространстве???


4-33400
Akvilon
2003-06-10 22:44
2003.08.11
Handles стандартных окошек (вроде кнопок)