Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

Помогите избавиться от ошибки (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
14-33811
Vlad Oshin
2003-08-25 13:23
2003.09.11
WinXPPro два вопроса.


8-33698
Vin_Ghost
2003-05-13 23:10
2003.09.11
DELPHIX


1-33600
evgeny_krasilov
2003-09-01 11:30
2003.09.11
TOleContainer


14-33815
Romkin
2003-08-21 13:16
2003.09.11
Еще задачка


6-33700
s.ts
2003-07-11 16:49
2003.09.11
получение курсов валют центробанка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский