Форум: "Сети";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизСокеты 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c