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

Вниз

Все та же ошибка 10055 при попытке подключения TClientSocket   Найти похожие ветки 

 
Sregey   (2001-11-22 17:49) [0]

Как продолжение беседы "Ошибки при попытке подключения TClientSocket".
Пытаюсь получить список открытых портов ЛЮБОЙ локальной машины.
На 249 порту выходит ошибка 10055 (No buffer space is available.)
Вот исходник:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
if Button1.Caption = "Start" then begin
Button1.Caption:= "Stop";
ListBox.Items.Clear;
Nxt:= true;
Client.Host:= Edit1.Text;
i:= SpinEdit1.Value;
Quit:= false;
Repeat
if Nxt then begin
Label2.Caption:= "Port:"+IntToStr(i);
Nxt:= false;
Client.Port:= i;
Client.Open;
Inc(i);
end;
Application.ProcessMessages;
Until Quit or (i > SpinEdit2.Value);
Button1.Caption:= "Start";
end else begin
Quit:= true;
Button1.Caption:= "Start";
end;
Label2.Caption:= "Port:";
Client.Close;
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
With (Sender as TClientSocket)do begin
Close;
ListBox.Items.Add(IntToStr(Port));
Nxt:= true;
end;
end;

procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
With (Sender as TClientSocket)do begin
ErrorCode:= 0;
Nxt:= true;
end;
end;

procedure TForm1.ClientLookup(Sender: TObject; Socket: TCustomWinSocket);
begin
With (Sender as TClientSocket)do begin
Sleep(100);
Nxt:= true;
end;
end;

end.

Интересно, если не делать Sleep(100), ошибка вылазит на 78 порту.
Помогите, пожалуйста. Где ошибка?
(Диапазон портов задается в SpinEdit1.Value и SpinEdit2.Value;
список открытых портов в ListBox)
Да, и как специалисты, покажите, где программный код не оптимален


 
Polevi ©   (2001-11-23 09:59) [1]

procedure Next
begin
cs.close;
cs.Port:=cs.Port+1;
cs.Open;
end;

procedure Click;
begin
cs.Open;

procedure OnConnect;
listbox.items.Add(IntToStr(cs.Port);
cs.Next;

procedure OnError;
cs.Next;


 
Hair_Fly ©   (2001-11-23 10:54) [2]

Буквально вчера приобретенный мной опыт подсказывает, что при возникновении ошибки сокета необходимо закрывать этот сокет:

procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
With (Sender as TClientSocket)do begin
ErrorCode:= 0;
Nxt:= true;
end;
Socket.Close; // Обрати внимание, что именно Socket (TCustomWinSocket),
// а не ClientSocket (TClientSocket)
end;


 
Polevi ©   (2001-11-23 11:02) [3]

Hair_Fly ©
Это лишнее


 
Digitman ©   (2001-11-23 11:30) [4]

>Polevi
Нет, не лишнее. Метод Open прежде всего безусловно выделяет ресурсы под новое гнездо (будет оно успешно соединено или нет - на этапе создания гнезда еще неизвестно), в то время как Close безусловно освобождает ресурсы под гнездо, распределенное в Open.
Убедись в этом сам, еще раз заглянув в Scktcomp.pas


 
Sregey   (2001-11-23 18:30) [5]

Спасибо за ответы, тут пока их ждал, следил за перепиской по вопросу
"Ошибки при попытке подключения TClientSocket".
В результате написал следующее:

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

Ошибка стала выдаваться не на 249 порту, а по-позже. И все-равно она ЕСТЬ!

Возможно, она появляется, из-за ассинхронного закрытия - еррор срабатывает значительно позже, за это время открывается МОРЕ портов. Попробовал создать новый код, приостанавливающийся на определенном этапе, пока не будут закрыты часть открытых портов! И все-равно ошибка! Где-то на порту 470-м при скорости 0,7 портов за сек.
Вот исходники, я ничего не понимаю... Никакого удовольствия программировать сеть ... Одни глюки. Что на этот раз не так?

Const MaxLookUp = 10;

type
TForm1 = class(TForm)
ListBox: TListBox;
Panel1: TPanel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Client: TClientSocket;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientLookup(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
Nxt,Quit,flLookUp : Boolean;
CountLookUp : Byte;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
TimeSt, tmp: _SYSTEMTIME;
begin
if Button1.Caption = "Start" then begin
Button1.Caption:= "Stop";
ListBox.Items.Clear;
Nxt:= true;
Client.Host:= Edit1.Text;
i:= SpinEdit1.Value;
Quit:= false;
CountLookUp:= 0; flLookUp:= true;
GetLocalTime( TimeSt);
Repeat
if Nxt then begin
Label2.Caption:= "Port:"+IntToStr(i);
Nxt:= false;
Client.Port:= i;
Client.Open;
Inc(i);
end;

GetLocalTime( tmp);
Label3.Caption:= "скорость: "
+Copy(FloatToStr(((tmp.wDay-TimeSt.wDay)*86400+(tmp.wHour-TimeSt.wHour)*3600+(tmp.wMinute-TimeSt.wMinute)*60+(tmp.wSecond-TimeSt.wSecond))/(i-SpinEdit1.Value)),1,5)
+" : "+IntToStr(CountLookUp);
Application.ProcessMessages;
Until Quit or (i > SpinEdit2.Value);
Button1.Caption:= "Start";
end else begin
Quit:= true;
Button1.Caption:= "Start";
end;
Label2.Caption:= "Port:";
Client.Close;
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Client.Close;
Socket.Close; //на всякий случай, но не работает и сней и без нее ...
ListBox.Items.Add(IntToStr(Client.Port));
end;

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

procedure TForm1.ClientLookup(Sender: TObject; Socket: TCustomWinSocket);
begin
if flLookUp then begin
Inc(CountLookUp); flLookUp:= CountLookUp < MaxLookUp;
Nxt:= true;
end;
end;

procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Dec(CountLookUp);
flLookUp:= true; Nxt:= true;
end;



 
Sregey   (2001-11-26 09:55) [6]

Господа! Однако ошибка не исчезает! Только возникает попозже.
Чего еще не хватает?


 
Gms ©   (2001-12-11 03:18) [7]

Как я понял то проблема не в ресурса выделяемых под соединение в том, что у тебя прога циклически выполняется и еслиб не
application.procesmessages то вообще б висела !

у меня подозрение такое - ошибки возникающие не обрабатываются в onSocketError в результате общего торможения и не дожидаясь вываливаются уже в то что ты описал !

в доказательсто тому служит :

у меня на компе 380Mhz сканирующая прога иногда глючила а в клубе 900Mhz оная не разу не галюнула из этого следует что в клубе просто успевает обрабатываться эта ошибка цивильно !

Пробывал сканировать в треаде но тоже не получается !


надеюсь что у тебя получится ! отпиши мне на мыло Sregey !



 
Hardward   (2002-01-16 19:50) [8]

Недавно сам искал
Введи в Yandex 10055



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

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

Наверх




Память: 0.49 MB
Время: 0.01 c
6-91029
Елена3000
2002-01-11 23:43
2002.03.28
Disconnect ~ Connect


14-91062
McSimm
2002-02-14 10:30
2002.03.28
О правиле имен :)


3-90778
ExxP
2002-03-04 03:53
2002.03.28
Отмена удаления записи после события


3-90774
Lena
2002-03-01 20:32
2002.03.28
Помогите!


14-91071
APL
2002-02-16 13:47
2002.03.28
Читалка форума в оффлайне