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

Вниз

Socket   Найти похожие ветки 

 
Fixxxer   (2003-05-12 00:37) [0]

Уважаемые мастера! Пишу программу с использованием сокетов. Когда включаю сервер во время разработки, т.е. совйство ServerSocket.Active сразу ставлю на True, то все работает нормально, но если я это делаю программно при создании формы, вылетает ошибка Asynchronous socket error 10061. Что это значит, и как с этим бороться?
Заранее благодарю.


 
Digitman   (2003-05-12 08:22) [1]


> вылетает ошибка


... connection refused (попытка установления соединения отвержена сервером), возбуждаемая компонентом TClientSocket (!)

1. проверь соответстие св-в Port у компонентов TClientSocket и TServerSocket

2. св-во TServerSocket.Active = True должно быть установлено ДО того, как устанавливается св-во TClientSocket.Active = True


 
Fixxxer   (2003-05-12 10:21) [2]

Ошибка происходит в серверном приложении. Клиент тут ни при чем. При запуске сервера в real time и происходит ошибка.


 
Digitman   (2003-05-12 10:50) [3]

Да мало ли что у тебя еще делает серверное приложение, кроме работы с объектом TServerSocket ! Может, оно еще и TClientSocket создает)

Однозначно утверждаю - в ходе исполнения строчки
ServerSocket.Active := True такое исключение возникнуть не может ! Это - исключение чисто клиентского компонента, неважно в каком приложении созданного.

трассируй пошагово обработчик OnCreate (в котором. как я понял, строчка эта и находится) и убедись самостоятельно в том, что такого исключения на этой строчке нет !

p.s.
"real time" и "run-time" - сущности абсолютно разные, не путай их. То, о чем ты говоришь, это именно "run-time".


 
Fixxxer   (2003-05-12 11:36) [4]

Большое спасибо за помощь. Разобрался. Это действительно ClientSocket выдавал ошибку.


 
Fixxxer   (2003-05-12 11:50) [5]

Не могу отловить этот Exception. Пишу так:

try
ClientSocket1.Open;
except
on ESocketError do ShowMessage("connection failed");
end;

При трассировке пошагово это место проходит, доходит до конца и только потом выдает ошибку.
Как с этим бороться?


 
Digitman   (2003-05-12 12:07) [6]

либо используй TClientSocket.ClientType = ctBlocking,
либо назначай и обрабатывае его АСИНХРОННОЕ событие OnError()


 
Fixxxer   (2003-05-12 12:33) [7]

а можно по-подробнее?


 
Digitman   (2003-05-12 14:44) [8]


> Fixxxer


что поподробнее ?


 
Fixxxer   (2003-05-12 18:38) [9]

Как мне обработать асинхронное событие OnError()?
В ней использовать try... except? Да вроде не поможет :/. Выскакивающее сообщение об ошибке не исчезнет.

Если использую TClientSocket.ClientType = ctBlocking, то от сообщения об ошибке вроде избаляюсь, но соединяться не хочет :/

Что мне лучше сделать в этих ситуациях?


 
Digitman   (2003-05-13 09:50) [10]


> Как мне обработать асинхронное событие OnError()?
> В ней использовать try... except? Да вроде не поможет :/.
> Выскакивающее сообщение об ошибке не исчезнет.


хэлп-то иногда читаешь ?) для кого ж он писан Борландом, как не для тебя ?)

Occurs when the socket fails in making, using, or shutting down a connection.

property OnError: TSocketErrorEvent;

Description

Write an OnError event handler to respond to errors that arise with the socket connection. Set the ErrorCode parameter to 0 if the OnError event handler successfully deals with the error condition, to prevent an ESocketError from being raised.

отсюда впорле понятно: для того, чтобы "погасить" ошибку , в обработчике события нужно установить

ErrorCode := 0;

кр.сого, в случае если ErrorCode = 10061 (и некоторые другие коды ошибок, связанных с неудачной попыткой коннекта), в том же обработчике следует выполнить

Socket.Close;


> Если использую TClientSocket.ClientType = ctBlocking, то
> от сообщения об ошибке вроде избаляюсь, но соединяться не
> хочет


ты ж ее, вероятно, гасишь в этом случае в блоке except..end !
а "соединяться не хочет" - так ведь и в случае ctNonBlocking у тебя тоже соединение не устанавливается ! По точно той же причине (не знаю пока - какой) ! Режим-то здесь совершенно ни при чем) ... Просто при ctBlocking исключения, возникающие при вызове методов объекта-гнезда, можно перехватывать и обрабатывать непосредственно в блоке except..end, в отличие от ctNonBlocking, при котором исключение должно анализироваться тобой и обрабатываться в процедуре-обработчике события OnError()


 
Fixxxer   (2003-05-13 11:56) [11]

Большое спасибо за помощь.

Избавился от ошибки так:

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
ClientSocket1.Close;
end;


 
Digitman   (2003-05-13 12:49) [12]

>Избавился от ошибки так:

от одной избавился, другую "заработал")


procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close; // разницу прочувствуй !!!!!!
end;


 
Fixxxer   (2003-05-13 16:14) [13]

Да-да, точно. Это я в попыхах. :)
Спасибо :)


 
Fixxxer   (2003-05-13 16:20) [14]

Ещё способ избавиться от ошибки:

try
try
ClientSocket1.Open
finally
end
except
ShowMessage("Ошибка");
end;

Но при компиляции сообщение об ошибке выскакивает, а в откомпилированном проекте сообщения уже не будет.


 
Fixxxer   (2003-05-13 16:23) [15]

А нет. Прошу прощения. В последнем случае сообщение об ошибке будет. Это я не присвоил свойству ClientSockt.Address адрес. Он и не пытался конектиться :)


 
Digitman   (2003-05-13 16:36) [16]


> при компиляции сообщение об ошибке выскакивает


чего-чего ?? какая ошибка может "выскочить" при "компиляции", если ни о каком коннекте речи в этот момент не идет ?


 
Fixxxer   (2003-05-13 21:22) [17]

У меня ClientSocket.Open стоит в FormCreate. Из-за этого при компиляции ошибка.

Но я удивляюсь, как можно так сразу выявить ошибку! Digitman, мой искренний поклон тебе.


 
Palladin   (2003-05-14 00:23) [18]

в положении поклона оставатся минут 20...
меня бы на такие разьяснения не хватило бы...


 
Digitman   (2003-05-14 08:26) [19]


> Fixxxer



> У меня ClientSocket.Open стоит в FormCreate. Из-за этого
> при компиляции ошибка.


Да ну чушь же ! Мало ли где ClientSocket.Open можно разместить ! При чем здесь компиляция-то ?? Ведь выполнение оператора происходит в run-time, а не в compile-time !


 
Fixxxer   (2003-05-14 12:25) [20]

>Digitman
>При чем здесь компиляция-то ??


Да. Ты прав. Всё же между F9 и Ctrl+F9 есть разница.


 
Digitman   (2003-05-14 12:45) [21]


> Fixxxer


Эт точно)

Ctrl-F9 - только компиляция

F9 - компиляция + сборка + запуск


 
tiam   (2003-05-14 16:23) [22]

2 digitman
>Избавился от ошибки так:

от одной избавился, другую "заработал")


procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close; // разницу прочувствуй !!!!!!
end;

А в чем разница. Почему именно к сокету?


 
Digitman   (2003-05-14 17:55) [23]


> tiam


в данном частном случае разница невелика, но в общем случае, когда обработчик - один на N объектов класса TClientSocket, параметр Socket: TCustomWinSocket - это именно тот объект, метод Close которого следует вызвать.


 
Digitman   (2003-05-14 17:58) [24]


> tiam


в данном частном случае разница невелика, но в общем случае, когда обработчик - один на N объектов класса TClientSocket, параметр Socket: TCustomWinSocket - это именно тот объект, метод Close которого следует вызвать.

При такой практике (ClientSocket1.Close), дающей не оч.хорошую привычку, рано или поздно это стрельнет ошибкой



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

Форум: "Сети";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.007 c
14-68031
Devil
2003-06-26 15:56
2003.07.21
Инсталлятор BDE


14-67994
JFX
2003-07-02 13:58
2003.07.21
Вопрос по программированию в MS-Dos


14-68054
Феликс
2003-07-04 21:59
2003.07.21
Можно ли осуществлять поиск на чужом сайте?


14-68012
cyborg
2003-07-04 09:51
2003.07.21
Delphi 6 Update Pack #2


14-68032
Soft
2003-07-04 16:30
2003.07.21
Microsoft Windows NT Server 4.0 против UNIX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский