| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > TClientSocket |
| Автор: Гость_Игорь 11.10.2005, 11:34 |
| Использую компонент TClientSocket для опроса контроллера по сети При разрыве связи прога выдает сообщение "Asynchronous socket error 10053". Вопрос в следующем: 1. Как заставить прогу не выдавать это окно. 2. Каким образом организовать автоконнект при отсутствии связи. Пробовал различные варианты с Socket->Active = true но ничего не получилось. В Buildere не силен, а в сях заморишся нужное окно писать. Спасибо |
| Автор: _hunter 11.10.2005, 12:25 |
| http://forum.vingrad.ru/index.php?showtopic=58171 http://forum.vingrad.ru/index.php?showtopic=58209 http://forum.vingrad.ru/index.php?showtopic=58521 |
| Автор: Гость_Игорь 11.10.2005, 14:15 |
| 1 ссылка) толковая, но самый интересный для меня вопрос без ответа 2 ссылка) не могу понять куда и чего вдолбить чтобы убрать ошибку client.cpp #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } на всякий случай код unit.cpp #include <vcl.h> #include <dos.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { MemoIn->Items->Clear(); MemoOnOff->Lines->Clear(); MySocket->Active = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::MySocketRead(TObject *Sender, TCustomWinSocket *Socket) { MemoIn->Items->Add(Socket->ReceiveText()); } //--------------------------------------------------------------------------- void __fastcall TForm1::MySocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { MemoOnOff->Lines->Clear(); MemoOnOff->Lines->Add("Ñáîé ñîåäèíåíèÿ"); // MySocket->Active = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::MySocketConnecting(TObject *Sender, TCustomWinSocket *Socket) { MemoOnOff->Lines->Clear(); MemoOnOff->Lines->Add("Ñîåäèíåíèå óñòàíîâëåíî"); } 3 ссылка) немного юмора для поднятия настроения |
| Автор: _hunter 11.10.2005, 14:35 |
| реакция на ошибку у тебя есть, значит осталось MySocket->Active = true; ( из __fastcall TForm1::TForm1(TComponent* Owner) ) в обработчик засунуть: __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { MemoIn->Items->Clear(); MemoOnOff->Lines->Clear(); try { MySocket->Active = true; } catch(...) { } } и все... |
| Автор: Гость_Игорь 11.10.2005, 17:36 |
| Может еще что-то надо изменить? ошибка выскакивает, после подключения сокет не востанавливается |
| Автор: _hunter 11.10.2005, 17:58 |
| выскакивает в билдере? тогда отключи останов на делфийских исключениях: Tolls->Debugger Options->Language Exceptions->Stop on Delphi Exceptions а насчет востановления -- скорее всего сокет пересоздать нужно будет... но не уверен |
| Автор: Гость_Игорь 12.10.2005, 09:33 |
| Ошибка выскакивает и в билдере и в готовом ехе сделал следующее void __fastcall TForm1::MySocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { [b]MySocket->Active = false;[/b] MemoOnOff->Lines->Clear(); MemoOnOff->Lines->Add("Сбой подключения"); } повесил кнопку с MySocket->Active = true; теперь после сообщения об ошибке нажав кнопку сокет востанавливается можно ли в билдере сделать цикл или еще что-то типа: 1 создавать сокет до тех пор пока !ок 2 в случае сокетерор переход на 1 и как заставить не появлятся сообщение об ошибке "Asynchronous socket error 10053" или ему подобные(если неудача при попытке создания сокета цифры другие) ведь в этом случае выполнение кода приостанавливается пока не нажмешь ок на "Asynchronous socket error 10053". для меня это принципиальная задача, события с контроллера будут писатся в лог, в случае допустим "рестарт свитч", учета событий не будет пока кто-то не закроет сообщение об ошибке и нажмет "подключиться". Странно. Я думал есть готовое решение, ведь такая задача может появится довольно часто. Или надо использовать какие-то другие компоненты и функции билдера? |
| Автор: Artemon 12.10.2005, 10:03 |
| В OnError сокета, устанавливай ErrorCode в NULL. И тогда все случившееся ошибки будут игнорироваться, но не забывай также try и catch. |
| Автор: Гость_Игорь 12.10.2005, 14:41 |
| спасибо hunter'у, Artemon'у и Бегемоту из поста http://forum.vingrad.ru/index.php?showtopic=56125 (сам бы не додумался организовать цикл при помощи таймера) Все работает как надо 1 создавать сокет до тех пор пока !ок 2 в случае сокетерор переход на 1 НИКАКИХ сообщений об ошибке сокета больше не вылетает даю код, мож кому пригодится //--------------------------------------------------------------------------- #include <vcl.h> #include <dos.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { MemoOnOff->Lines->Clear(); try { MySocket->Active = true; } catch(...) { } } //--------------------------------------------------------------------------- void __fastcall TForm1::MySocketRead(TObject *Sender, TCustomWinSocket *Socket) { MemoIn->Items->Add(Socket->ReceiveText()); } //--------------------------------------------------------------------------- void __fastcall TForm1::MySocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { ErrorCode = NULL; //одна строка и в случае ошибок сокета никаких прерываний в работе! MySocket->Active = false; //без этой строки сокет не востановишь MemoOnOff->Lines->Clear(); MemoOnOff->Lines->Add("Ñáîé ñîåäèíåíèÿ"); MemoIn->Items->Add("Ñáîé ñîåäèíåíèÿ"); Timer1->Enabled=true; //запускаем цикл автоподключений } //--------------------------------------------------------------------------- void __fastcall TForm1::MySocketConnecting(TObject *Sender, TCustomWinSocket *Socket) { MemoOnOff->Lines->Clear(); MemoOnOff->Lines->Add("Ñîåäèíåíèå óñòàíîâëåíî"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) //в свойстве интервал не забудте выставить время. { MySocket->Active = true; Timer1->Enabled = false; } //--------------------------------------------------------------------------- |
| Автор: Dubinsky 1.11.2005, 15:50 |
| ErrorCode как советует сам билдер надо не в НУЛЛ ставить а в 0 , ну и вообще надо смотреть что за код ошибки ! там не только отсутствие связи , но и ещё куча ...на них то наверняка надо как то по другому реагировать ... |