Текущий архив: 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.48 MB
Время: 0.006 c