Консультация № 185089
06.01.2012, 17:25
165.80 руб.
0 17 0
Здравствуйте! Прошу помощи в следующем вопросе: Программа написана на Delphi 7, использую ClientSocket. Программа подключается, через какое то время выходит сообщение "Asynchronous socket error 10060". Подскажите как правильно обработать данную ошибку. Заранеее благодарю за внимание.

Обсуждение

давно
Старший Модератор
31795
6196
06.01.2012, 18:15
общий
Адресаты:


ошибка "Asynchronous socket error 10060", обозначающая, что не удалось установить соединение.


1)программу в студию.
2)Firewall включен?
3)"снифа" запускали?

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
06.01.2012, 18:22
общий
Если память не изменяет эта ошибка возникает когда порт к которому подключается ClientSocket занят другим приложением или возможно две ваши програми питаются работать одновременно с портом.
давно
Посетитель
352040
133
06.01.2012, 18:25
общий
06.01.2012, 18:27
Ну тут есть некоторые нюансы. У меня не чат и тому подобное. Я уже на форуме вопросы задавал по этому устройству. Это Ethernet модуль Jerome. У меня управление оботудованием идет через него. Причем ошибка вылазит один раз после включения, нажал "ОК" и далее все работает уже без ошибок. Firewalla у меня нет, если не считать касперского, а судя по сетевой активности касперского, обмен идет.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
06.01.2012, 18:27
общий
VolRus - у меня только одна программа работает с устройством. Больше не чему ....
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
06.01.2012, 18:37
общий
Адресаты:
привет! прогони прогу "по шагам" в delphi
или каждый раз при попытке соединения показывай сообщение какое-нибудь...
ошибки почти всегда простые.
скорее всего - ты пытаешься 2 раза соединится с девайсом...
давно
Посетитель
352040
133
06.01.2012, 18:40
общий
Забыл добавить. Если делаю таким образом
Код:
procedure TForm1.CS1Error(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ShowMessage('Ошибка' + IntToStr(ErrorCode));
ErrorCode :=0;
logs('Ошибка'+ IntToStr(ErrorCode));
end;

То программа виснет. И на внешние раздражители не реагирует.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
06.01.2012, 18:43
общий
06.01.2012, 18:46
Да вроде как один раз подключаюсь. Но ошибка при каждом подключении, и только один раз. Больше ошибок нет. Можно конечно на нее не обращать внимания... Но мне кажется, что такой подход не правильный.
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
{Тут всяко разное для проги}
Sleep(500);

CS1.Port := StrToInt(LabeledEdit2.text);///Порт
CS1.Address :=LabeledEdit1.text;///IP адрес
CS1.Active :=True;
CS1.Open;

Sleep(100);
CS1.Socket.SendText('$KE,PSW,SET,Jerome'#13#10);///Отправка пароля устройству
end;
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
06.01.2012, 18:56
общий
06.01.2012, 19:20
Попробуйте без CS1.Active :=True; или CS1.Open;
Мне кажется CS1.Open; аналогично CS1.Active :=True;

в исходниках TAbstractSocket родителя класса TClientSocket вот это

Код:

procedure TAbstractSocket.Open;
begin
Active := True;
end;


Обработка ошибки

Код:

try
CS1.Port := StrToInt(LabeledEdit2.text);///Порт
CS1.Address :=LabeledEdit1.text;///IP адрес
CS1.Open;
except
on E: Exception do
if E is ESocketError then
(E As ESocketError).Message //текст ошибки
//в данном случае можно писать просто E.Message
end;

давно
Посетитель
352040
133
06.01.2012, 19:19
общий
Сделал как посоветовал VolRus, ошибка пропала. Нужно пару дней погонять для проверки.
Код:
   
CS1.Active :=True;
{CS1.Open;
}


Алексей. В этой процедуре у меня
Код:
TForm1.FormCreate(Sender: TObject)
1-Чтение конфигурации и настроек программы
2-Проверка на повторный запуск программы
Sleep(500);
3-Работа с сетью

Задержку можно в принципе и не обязательно делать, я так, на всякий случай сделал.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
07.01.2012, 11:54
общий
07.01.2012, 12:01
Адресаты:
Цитата: Владимир
Да вроде как один раз подключаюсь.

А вот и неправда...
Цитата: Владимир
CS1.Active :=True;
CS1.Open;

Эти две строчки делают одно и тоже, следовательно Вы подключаетесь два раза, оттого и ошибка выскакивает.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
07.01.2012, 12:01
общий
07.01.2012, 12:23
Цитата: Владимир
То программа виснет. И на внешние раздражители не реагирует.

А ShowMessage() у Вас отрабатывает, сообщение то выводится?

И по поводу этой процедуры обработки ошибки.
1.
Код:
 logs('Ошибка'+ IntToStr(ErrorCode)) ;

это однозначно работать не будет, точнее, эта строка совершенно бесполезна, т.к. строкой ранее
Код:
ErrorCode :=0;

Вы код ошибки собственноручно стёрли.
2. У Вас там в заголовке функции есть параметр
Код:
ErrorEvent: TErrorEvent

который однозначно указывает на тип ошибки.
Код:
type TErrorEvent = (eeGeneral, eeSend, eeReceive, eeConnect, eeDisconnect, eeAccept, eeLookup)

Тут всё понятно и без объяснений. С помощью этого параметра можно выводить внятное ссобщение об ошибке, например:
Код:
Case ErrorEvent Of
eeGeneral: ShowMessage('Непонятная ошибка. Скорее всего сбой системы.');
eeSend: ShowMessage('Ошибка при передаче данных.');
eeReceive: ShowMessage('Ошибка при приёме данных.');
eeConnect: ShowMessage('Ошибка при подключении к устройству.');
eeDisconnect: ShowMessage('Ошибка при отключении от устройства.');
eeAccept: ShowMessage('Ошибка получения данных.');
eeLookup: ShowMessage('Ошибка при поиске устройства.');
End;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
07.01.2012, 17:05
общий
07.01.2012, 17:06
sir Henry - Я е спорю. Как подсказали, тут у меня двойное подключение. Но я его исправил
Код:
 CS1.Active :=True;
{CS1.Open;
}
А по поводу функции
Код:
logs('Ошибка'+ IntToStr(ErrorCode)) ;

У меня есть такая штука которая пишет все где я ставлю писать, может и не правильно, но помогает.
Код:
procedure TForm1.logs(str:string);
var in_file: textFile;
FileName,date,time: string;
begin
FileName:='C:\Test\log.txt';
assignFile(in_file, FileName);
if not (FileExists(FileName)) then rewrite(in_file)
else
Append(in_file);
date:=DateToStr(Now());
time:=TimeToStr(Now());
Write(in_file, date);
Write(in_file, chr(9));
Write(in_file, time);
Write(in_file, chr(9));
WriteLn(in_file, str);
closeFile(in_file);
end;

И она пишет ошибки и не только.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Старший Модератор
31795
6196
07.01.2012, 18:01
общий
Адресаты:
Цитата: Владимир
sir Henry - Я е спорю.

Цитата: Владимир
VolRus - у меня


Вы обращаетесь к участнику мини-форума Вашего вопроса, при этом не указываете адресата(выпадающий список под названием КОМУ:, см. над полем ввода сообщения). Сообщение без адресата отсылается ВСЕМ экспертам участвующим в обсуждении этого вопроса. Совет: используйте поле адресата сообщения. Это экономит трафик портала(как минимум) и позволяет другим экспертам ориэнтироватся, что именно Вы ответили на заданный экспертом вопрос.

Своё первое сообщение в мини-форуме я написал ориентируясь только на характер ошибки, т.к. самого кода нет, а это:
Цитата: Зенченко Константин Николаевич
ошибка "Asynchronous socket error 10060", обозначающая, что не удалось установить соединение.

ошибка подключения- не проходят пакеты или что-то не правильно передается.
Цитата: Зенченко Константин Николаевич
2)Firewall включен?
3)"снифа" запускали?

2) Firewall вполне успешно может "резать" исходящие пакеты данных. Правда?
3) Содержимое самих пакетов может содержать ошибочную информацию, а для анализа передаваемых-получаемых данных - логично использовать снифер. Снифер Вам бы сразу показал, что идет двойное обращение из программы.

Теперь по другим сообщениям:
Цитата: Вадим Исаев ака sir Henry
ErrorCode :=0; Вы код ошибки собственноручно стёрли.

Цитата: Владимир
У меня есть такая штука которая пишет все

Код этой штучки, как вызывающий код экперты узнавали только после того как начали "выкручивать" Вам руки ( )

Думаю, Вы теперь видете, сколько Вы могли сберегти времени на решении своего вопроса, если бы он был задан более-мение правильно. Ещё совет: постарайтесь предоставлять как можно больше информации в самом вопросе, т.к. это экономит время, Ваше и экспертов.

Удачи!
С праздниками!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
07.01.2012, 18:14
общий

Цитата: 294627
возможно две ваши програми питаются работать одновременно с портом.

Цитата: 388018
скорее всего - ты пытаешься 2 раза соединится с девайсом...

Ребята с разницей в 15-ть минут Вы в темную(не видя кода) высказали правильное мнение(повторное обращение к открытому порту). Пожалуйста, договоритесь между собой кто будет отвечать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Мастер-Эксперт
425
4118
07.01.2012, 19:09
общий
07.01.2012, 19:10
Цитата: Владимир
И она пишет ошибки

Не знаю, как у Вас идёт обработка других ошибок, но в данном случае, исходя из того кода, что Вы изложили, она у Вас передаёт параметром то, что не соответствует действительности, т.е. 0. Если не верите, посмотрите сами, что у Вас записывается в результате именно описанной Вами ошибки.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
08.01.2012, 02:19
общий
Всем доброго времени суток..
я отвечать не буду.
давно
Посетитель
352040
133
08.01.2012, 11:11
общий
08.01.2012, 11:13
Ваш совет помог. Оставил одну активацию порта, и ошибка пропала
Код:
CS1.Active :=True;
Считаю что тема закрыта. Всем спасибо за участие в обсуждении.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Форма ответа