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