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

Вниз

Помогите избавиться от ошибки (Socket error 10065)   Найти похожие ветки 

 
FireMan_Alexey ©   (2003-06-26 16:30) [0]

Суть дела такова. У меня есть адрес или хост к которому мне надо приконектиться, но я не знаю существует ли он вообще. Используя TClientSocket, получаю ошибку 10065 - "узел отсутствует" , как я понимаю!
Но отловить ее ни в OnError ни в Try Except не могу.
Посоветуйте пожалуйста как быть.
Не хотелось бы переделывать работу заново.
Пробовал писать, как советует DigitMan, в OnError
Socket.Disconnect(Socket.SocketHandle);
Но это событие даже не возникает, а ошибку выдает сразу после
ClientSocket.Open;


 
Карелин Артем ©   (2003-06-26 16:48) [1]

Может Application.OnException спасет...


 
Digitman ©   (2003-06-26 17:01) [2]

код приведи свой
и - режим какой у тебя ... блок или неблок


 
Delphin ©   (2003-06-26 17:30) [3]

ClientSocket1.Host:=Edit1.Text;
Try
ClientSocket1.Connect;
Except
....
DestroyWindow(WM_Close);
......
End;


 
FireMan_Alexey ©   (2003-06-27 14:39) [4]

>DigitMan
режим не блокирующий
текст
Procedure TMain.ProxyServClientRead(Sender: TObject;Socket: TCustomWinSocket);
Var
S,S1:String;
I1,I2,L:Integer;
Buf:Pointer;

Begin
//
IF TClientSocket(Socket.Data).Active then
Begin
I1:=Socket.ReceiveLength;
GetMem(Buf,I1);
Socket.ReceiveBuf(Buf^,I1);
TClientSocket(Socket.Data).Socket.SendBuf(Buf^,I1);// Отсылаю данные
FreeMem(Buf,I1);
End
Else
Begin
L:=Socket.ReceiveLength;
S:=Socket.ReceiveText;
I1:=Pos("Host",S)+6;
I2:=Pos("Proxy",S)-2;
S1:=Copy(S,I1,I2-I1);
If not GetAddr(S1,80) Then
Begin
Socket.SendText(ErrorProxy_HTTP(ProxyErrors[1]));
Socket.Disconnect(Socket.SocketHandle);
Exit;
End;
TClientSocket(Socket.Data).Port:=80;//Настраиваю порт
TClientSocket(Socket.Data).Host:=S1;//Хост
TClientSocket(Socket.Data).Open; //Пытаюсь коннектиться
( Socket.Data)
>DigitMan
режим не блокирующий
текст
Procedure TMain.ProxyServClientRead(Sender: TObject;Socket: TCustomWinSocket);
Var
S,S1:String;
I1,I2,L:Integer;
Buf:Pointer;

Begin
//
IF TClientSocket(Socket.Data).Active then
Begin
I1:=Socket.ReceiveLength;
GetMem(Buf,I1);
Socket.ReceiveBuf(Buf^,I1);
TClientSocket(Socket.Data).Socket.SendBuf(Buf^,I1);// Отсылаю данные
FreeMem(Buf,I1);
End
Else
Begin
L:=Socket.ReceiveLength;
S:=Socket.ReceiveText;
I1:=Pos("Host",S)+6;
I2:=Pos("Proxy",S)-2;
S1:=Copy(S,I1,I2-I1);
If not GetAddr(S1,80) Then
Begin
Socket.SendText(ErrorProxy_HTTP(ProxyErrors[1]));
Socket.Disconnect(Socket.SocketHandle);
Exit;
End;
TClientSocket(Socket.Data).Port:=80;//Настраиваю порт
TClientSocket(Socket.Data).Host:=S1;//Хост
TClientSocket(Socket.Data).Open; //Пытаюсь коннектиться
TClientSocket(Socket.Data).Socket.SendText(S);// Отсылаю запрос
Label3.Caption:=S1;
End;
End;


 
Digitman ©   (2003-06-27 14:57) [5]

нет, подожди)

ты ведешь речь прежде всего о перехвате и обработке ошибок коннекта

где у тебя в коде обработка OnError() ? не вижу.

это - раз..

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

тогда на основании чего ты сразу же за
TClientSocket(Socket.Data).Open; ( Socket.Data) нет, подожди)

ты ведешь речь прежде всего о перехвате и обработке ошибок коннекта

где у тебя в коде обработка OnError() ? не вижу.

это - раз..

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

тогда на основании чего ты сразу же за
TClientSocket(Socket.Data).Open; //Пытаюсь коннектиться
делаешь
TClientSocket(Socket.Data).Socket.SendText(S);// Отсылаю запрос

??? где и каким образом ты фиксируешь факт успешной попытки коннекта, прежде чем пытаться отослать запрос через устанавливаемое соединение ?


 
FireMan_Alexey ©   (2003-07-01 15:02) [6]

>DigitMan
procedure TMain.ProxyServClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
//
Socket.Disconnect(Socket.SocketHandle);
ErrorCode:=0;
end;


Суть в том, что просто пробовал законектиться на существующий сайт указывая IP-адрес например 135.34.34.80 порт 80 и просто вызывал ClientSocket.Open, но если я в текущий момент не в интернете, то выдается ошибка 10065,
если же я указываю именно HOST, то OnError обрабатывает ошибку.

У меня своя подсеть. Маска подсети указана вручную 255.255.255.0
IP- ареса в диапазоне 192.168.0.*
возможно из-за данных настроек я не могу нормально законнектиться в инет?

А то, что я отсылаю сразу после OPEN, я исправил это и все раво не работает.
Извиняюсь что не прислал исходный код, я сейчас не на своей машине и исходника с собою нет.


 
Digitman ©   (2003-07-02 08:36) [7]


> то выдается ошибка 10065


> то OnError обрабатывает ошибку



не верю !!!!
при приведенном тобой теле OnError() ошибка будет "погашена" в любом случае, будь тобой указан или Host или Address - совершенно никакой разницы.


> то, что я отсылаю сразу после OPEN, я исправил это и все
> раво не работает


и каким же образом ты "исправил" ?
сдается мне, что по-прежнему (!) отказ с кодом 10065 ты имеешь при попытке выполнить именно метод send в момент после выполнения Open, но ДО момента реального коннекта либо возникновения события OnError()


 
Digitman ©   (2003-07-02 08:45) [8]

ты пойми главное - поскольку гнездо неблокирующее, то метод Open тут же возвратит тебе управление, еще ДО того, как будет фактически установлен коннект либо отказано в нем по каким-то причинам (связанным как правило с недоступностью/неактивностью целевого хоста/сервиса или с невозможностью с пом. DNS разрешить имя хоста в его IP-адрес).

о факте успешного коннекта говорит возникновение события OnConnect()

о факте НЕуспешного коннекта говорит возникновение события OnError() (причина отказа - в ErrorCode)

и вот ДО того, как возникнет событие OnConnect() выполнять какие-либо транспортные методы гнезда (send- либо receive-методы) совершенно бессмысленно - это 100%-но приведет к исключению ESocketError (а не к возбуждению события OnError !)



 
FireMan_Alexey ©   (2003-07-02 16:50) [9]

>Digitman
У меня еще вопрос, где можно достать описание функций на русском
socket
bind
и т.д.


 
Digitman ©   (2003-07-02 17:13) [10]

http://book.itep.ru


 
panov ©   (2003-07-02 17:15) [11]

У меня еще вопрос, где можно достать описание функций на русском

только переводы кусками в сети.


 
FireMan_Alexey ©   (2003-07-03 13:14) [12]

>Digitman
Просто экспериментировал и получил вот что.
В этом простом примере у меня возникает ошибка 10065 и я не могу ее отловить.
Возможно я где-то ошибаюсь :)
1. CS.Active=False в начале
2. Режим неблок.
3. Интернета нет

unit Example;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp;
type
TForm1 = class(TForm)
CS: TClientSocket;
procedure FormCreate(Sender: TObject);
procedure CSError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
( Sender: TObject)
>Digitman
Просто экспериментировал и получил вот что.
В этом простом примере у меня возникает ошибка 10065 и я не могу ее отловить.
Возможно я где-то ошибаюсь :)
1. CS.Active=False в начале
2. Режим неблок.
3. Интернета нет

unit Example;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp;
type
TForm1 = class(TForm)
CS: TClientSocket;
procedure FormCreate(Sender: TObject);
procedure CSError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
cs.Port:=80;
cs.Host:="154.34.34.80";
cs.Open;
end;

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


 
FireMan_Alexey ©   (2003-07-03 13:19) [13]

>Panov
А где достать эти обрывки?


 
Digitman ©   (2003-07-03 13:32) [14]

procedure TForm1.FormCreate(Sender: TObject);
begin
cs.Port:=80;
cs.Address:="154.34.34.80";
try
cs.Open;
except
on e: ESocketError do
( "Уррааа !!! Я поймал синхронную ошибку коннекта :"#10 + e.message) procedure TForm1.FormCreate(Sender: TObject);
begin
cs.Port:=80;
cs.Address:="154.34.34.80";
try
cs.Open;
except
on e: ESocketError do
ShowMessage("Уррааа !!! Я поймал синхронную ошибку коннекта :"#10 + e.message);
else
raise;
end;
end;


 
Digitman ©   (2003-07-03 13:38) [15]


> FireMan_Alexey


ты вообще-то в состоянии читать и анализировать исх.Паскаль-тексты стандартных компонентов от Борланда ? Ведь все что тебя заботило и будет заботить, элементарно выясняется анализом кода в модуле scktcomp.pas !



 
Douglas Quaid ©   (2003-07-11 10:35) [16]

Предусмотри в On Error следующее
ErrorCode := 0;

это "гасит" ошибку, в противном случае OnError выполняется, но ошибка соединения "всплывает"



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

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

Наверх




Память: 0.52 MB
Время: 0.025 c
14-33767
jack128
2003-08-21 19:00
2003.09.11
StringVirtualTree & Win9x


14-33723
wnew
2003-08-15 20:11
2003.09.11
---|Ветка была без названия|---


8-33692
GrayWolf
2003-05-14 22:25
2003.09.11
Прозрачный текст на канве


1-33614
Rel_
2003-09-01 08:45
2003.09.11
Проблема с ф-ей SetLength


7-33829
Reanimator
2003-06-26 17:36
2003.09.11
Internet Explorer и URL`ы