Главная страница
    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.5 MB
Время: 0.007 c
3-67694
SiDrugs
2003-06-26 20:08
2003.07.21
Правильно спроектировать и реализовать БД


4-68126
sapsi
2003-05-21 10:19
2003.07.21
Отловить Handle дочернего окна


1-67889
SiJack
2003-07-08 11:33
2003.07.21
Как получить список файлов не используя визуальных компонен


14-68076
craker
2003-07-06 02:15
2003.07.21
Лето-времени много, игроделы объединяйтесь!!!


3-67741
Bless
2003-06-18 09:05
2003.07.21
LocalTable





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