![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите избавиться от ошибки (Socket error 10065)
FireMan_Alexey © (2003-06-26 16:30:00)
Суть дела такова. У меня есть адрес или хост к которому мне надо приконектиться, но я не знаю существует ли он вообще. Используя TClientSocket, получаю ошибку 10065- "узел отсутствует" , как я понимаю!
Но отловить ее ни в OnError ни в Try Except не могу.
Посоветуйте пожалуйста как быть.
Не хотелось бы переделывать работу заново.
Пробовал писать, как советует DigitMan, в OnError
Socket.Disconnect(Socket.SocketHandle);
Но это событие даже не возникает, а ошибку выдает сразу после
ClientSocket.Open;
Douglas Quaid (2003-07-11 10:35:00) [1]
Предусмотри в On Error следующее
ErrorCode := 0;
это "гасит" ошибку, в противном случае OnError выполняется, но ошибка соединения "всплывает"
Digitman (2003-07-03 13:38:00) [2]
> FireMan_Alexey
ты вообще-то в состоянии читать и анализировать исх.Паскаль-тексты стандартных компонентов от Борланда ? Ведь все что тебя заботило и будет заботить, элементарно выясняется анализом кода в модуле scktcomp.pas !
Digitman (2003-07-03 13:32:00) [3]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;
FireMan_Alexey (2003-07-03 13:19:00) [4]
>Panov
А где достать эти обрывки?
FireMan_Alexey (2003-07-03 13:14:00) [5]>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;
panov (2003-07-02 17:15:00) [6]
У меня еще вопрос, где можно достать описание функций на русском
только переводы кусками в сети.
Digitman (2003-07-02 17:13:00) [7]
http://book.itep.ru
FireMan_Alexey (2003-07-02 16:50:00) [8]
>Digitman
У меня еще вопрос, где можно достать описание функций на русском
socket
bind
и т.д.
Digitman (2003-07-02 08:45:00) [9]
ты пойми главное - поскольку гнездо неблокирующее, то метод Open тут же возвратит тебе управление, еще ДО того, как будет фактически установлен коннект либо отказано в нем по каким-то причинам (связанным как правило с недоступностью/неактивностью целевого хоста/сервиса или с невозможностью с пом. DNS разрешить имя хоста в его IP-адрес).
о факте успешного коннекта говорит возникновение события OnConnect()
о факте НЕуспешного коннекта говорит возникновение события OnError() (причина отказа - в ErrorCode)
и вот ДО того, как возникнет событие OnConnect() выполнять какие-либо транспортные методы гнезда (send- либо receive-методы) совершенно бессмысленно - это 100%-но приведет к исключению ESocketError (а не к возбуждению события OnError !)
Digitman (2003-07-02 08:36:00) [10]
> то выдается ошибка 10065
> то OnError обрабатывает ошибку
не верю !!!!
при приведенном тобой теле OnError() ошибка будет "погашена" в любом случае, будь тобой указан или Host или Address - совершенно никакой разницы.
> то, что я отсылаю сразу после OPEN, я исправил это и все
> раво не работает
и каким же образом ты "исправил" ?
сдается мне, что по-прежнему (!) отказ с кодом 10065 ты имеешь при попытке выполнить именно метод send в момент после выполнения Open, но ДО момента реального коннекта либо возникновения события OnError()
FireMan_Alexey (2003-07-01 15:02:00) [11]
>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-06-27 14:57:00) [12]нет, подожди)
ты ведешь речь прежде всего о перехвате и обработке ошибок коннекта
где у тебя в коде обработка OnError() ? не вижу.
это - раз..
теперь - следующее.
ты утверждаешь, что режим для всех гнезд - неблокирующий.
тогда на основании чего ты сразу же за
TClientSocket(Socket.Data).Open; ( Socket.Data)нет, подожди)
ты ведешь речь прежде всего о перехвате и обработке ошибок коннекта
где у тебя в коде обработка OnError() ? не вижу.
это - раз..
теперь - следующее.
ты утверждаешь, что режим для всех гнезд - неблокирующий.
тогда на основании чего ты сразу же за
TClientSocket(Socket.Data).Open; //Пытаюсь коннектиться
делаешь
TClientSocket(Socket.Data).Socket.SendText(S);// Отсылаю запрос
??? где и каким образом ты фиксируешь факт успешной попытки коннекта, прежде чем пытаться отослать запрос через устанавливаемое соединение ?
FireMan_Alexey (2003-06-27 14:39:00) [13]>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;
Delphin (2003-06-26 17:30:00) [14]
ClientSocket1.Host:=Edit1.Text;
Try
ClientSocket1.Connect;
Except
....
DestroyWindow(WM_Close);
......
End;
Digitman (2003-06-26 17:01:00) [15]
код приведи свой
и - режим какой у тебя ... блок или неблок
Карелин Артем (2003-06-26 16:48:00) [16]
Может Application.OnException спасет...