Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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" или ему подобные(если неудача при попытке создания сокета цифры другие) smile
ведь в этом случае выполнение кода приостанавливается пока не нажмешь ок на "Asynchronous socket error 10053".
для меня это принципиальная задача, события с контроллера будут писатся в лог, в случае допустим "рестарт свитч", учета событий не будет пока кто-то не закроет сообщение об ошибке и нажмет "подключиться".
Странно. Я думал есть готовое решение, ведь такая задача может появится довольно часто.
Или надо использовать какие-то другие компоненты и функции билдера?
smile построение в билдере отличается от просто с++ в принципе

Автор: 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
(сам бы не додумался организовать цикл при помощи таймера)
Все работает как надо smile
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 , ну и вообще надо смотреть что за код ошибки ! там не только отсутствие связи , но и ещё куча ...на них то наверняка надо как то по другому реагировать ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)