먼저, 답변 감사합니다.
SNMP를 대신하여 IndyICMP 컴포넌트를 사용하여 서버쪽에 PING을 응답 여부에 따라
끊어 졌는지 붙어 있는지 판단하도록 수정을 하였습니다.
하지만, 전원을 껏다가 다시 키거나 랜선을 뺏다가 다시 연결 하였을 때,
서버쪽에 붙을때가 있고 떨어질때가 있습니다.
Q. 어떤 경우라도 정상적으로 잘 붙도록 해야되는데 어떤방법이 있는지 조언 부탁드립니다...
//---------------------------------------------------------------------------
void __fastcall TForm2::Send_Ping()
{
IdIcmpClient1->Host = P_IP;
IdIcmpClient1->Port = P_PORT;
IdIcmpClient1->Ping();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::IdIcmpClient1Reply(TComponent *ASender,
const TReplyStatus &AReplyStatus)
{
int RecvPing = AReplyStatus.BytesReceived;
if( RecvPing > 0 )
{
if(Client1_Watch) {
AP_Connection_State = 0;
}
else {
ClientSocket1->Close();
OM_FLAG = 1;
}
}
else
{
AP_ReConnection = 1; // 재연결
}
}
//---------------------------------------------------------------------------
int reconnect_resen = 0;
void __fastcall TForm2::Timer2Timer(TObject *Sender)
{
char tmp_buf[1024];
int size = 0;
int i=0;
if(AP_ReConnection) //핑
{
AP_ReConnection = 0;
reconnect_resen= 0;
if(Client1_Watch){
ClientSocket1->Close();
}
Client1_Watch = 0;
AP_COM_FLAG = 1;
}
else
{
if(btn_Connect->Caption == "시도중")
{
if(AP_COM_FLAG == 0)
{
if(reconnect_resen++ > 2)
{
AP_COM_FLAG = 1;
reconnect_resen = 0;
if(Client1_Watch){
ClientSocket1->Close();
}
Client1_Watch = 0;
}
}
}
}
AP_Connection_State++;
if(AP_Connection_State > 3)
{
AP_Connection_State = 0;
Send_Ping();
}
if(COM_FLAG)
{
COM_FLAG = 0;
btn_Connect->Caption = "시도중";
ClientSocket1->Address = P_IP;
ClientSocket1->Port = P_PORT;
ClientSocket1->Open();
//if(!ClientSocket1->Socket->Connected)
// ClientSocket1->Active = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
btn_Connect->Caption = "Conneted OK";
TCP_Count = 1;
AP_COM_FLAG = 0;
Client1_Watch = 1;
AP_ReConnection = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
btn_Connect->Caption = "Disconnected";
TCP_Count = 0;
AP_COM_FLAG = 1;
ClientSocket1->Close();
Client1_Watch = 0;
/*
memset(TEST_BUF, 0, sizeof(TEST_BUF));
sprintf(TEST_BUF,"Client1 Socket Disconnect", 0);
if(Memo1->Lines->Count > MEMO1_MAX_LINE)
Memo1->Lines->Clear();
Memo1->Lines->Add(TEST_BUF);
*/
//reconnetion_count = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::ClientSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
btn_Connect->Caption = "Error";
TCP_Count = 0;
COM_FLAG = 1;
TClientSocket *SocketCur = static_cast<TClientSocket *>(Sender);
if (ErrorCode == 10060) ErrorCode = 0;
if (ErrorCode == 10061) ErrorCode = 0;
if (ErrorCode == 10049) ErrorCode = 0;
if (ErrorCode == 10053) ErrorCode = 0;
if (ErrorCode == 10038) ErrorCode = 0;
if (ErrorCode == 10065) ErrorCode = 0;
SocketCur->Socket->Disconnect(SocketCur->Socket->SocketHandle);
SocketCur->Active = false;
}
//---------------------------------------------------------------------------
라스코니 님이 쓰신 글 :
: 주기적으로 SNMP 패킷을 보내서 상대방이 살아있는지 확인하시면 됩니다.
: 만약 정해진 시간내에 응답 패킷이 오지 않는다면 상대방과의 소켓 연결을 종료하면 되겠죠.
:
:
: newrise 님이 쓰신 글 :
: : 안녕하세요. 한창 삽질중인 신입입니다.
: :
: : 같은네트워크 상에 다른 장비[Server] -- PC[Client]프로그램
: : 위와 같은 구성이고
: : PC 프로그램에서 다른 장비에 붙어서 데이터를 주고 받는 프로그램을 짜고 있습니다.
: :
: : 서버쪽에서 일반적인 종료[정상적으로 연결 끊기]시 Timer를 통해 다시 연결을 시도합니다.
: : 하지만, 랜선 뽑기, 서버쪽 전원 OFF 시에는 프로그램이 인지를 못하고 있습니다.
: :
: : Q. Errorcode로 처리가 불가능한지 알고 싶습니다. 만약 방법이 없다면 어떤 방법이 효율적인지
: : 배우고 싶습니다.
: :
: : void __fastcall TForm2::Timer2Timer(TObject *Sender)
: : {
: : char tmp_buf[1024];
: : char msg_buf[20];
: : int size = 0;
: : int i=0;
: :
: : if(COM_FLAG)
: : {
: : btn_Connect->Caption = "연결중";
: : ClientSocket1->Address = P_IP;
: : ClientSocket1->Port = P_PORT;
: : ClientSocket1->Open();
: :
: : }
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm2::ClientSocket1Connect(TObject *Sender,
: : TCustomWinSocket *Socket)
: : {
: : btn_Connect->Caption = "Conneted OK";
: : TCP_Count = 1;
: : COM_FLAG = 0;
: :
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm2::ClientSocket1Disconnect(TObject *Sender,
: : TCustomWinSocket *Socket)
: : {
: : btn_Connect->Caption = "Disconnected";
: : TCP_Count = 0;
: : AP_COM_FLAG = 1;
: :
: : //reconnetion_count = 1;
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm2::ClientSocket1Error(TObject *Sender,
: : TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
: : {
: : // 클라이언트가 열려 있지 않은 서버 소켓에 대해 접속 시도하여도 에러 메시지창 표출 하지 않음
: : btn_Connect->Caption = "Disconnected";
: : TCP_Count = 0;
: : COM_FLAG = 1;
: :
: : TClientSocket *SocketCur = static_cast<TClientSocket *>(Sender);
: :
: : if (ErrorCode == 10060) ErrorCode = 0;
: : if (ErrorCode == 10061) ErrorCode = 0;
: : if (ErrorCode == 10049) ErrorCode = 0;
: : if (ErrorCode == 10053) ErrorCode = 0;
: : if (ErrorCode == 10038) ErrorCode = 0;
: : if (ErrorCode == 10065) ErrorCode = 0;
: :
: : //SocketCur->Socket->Disconnect(SocketCur->Socket->SocketHandle);
: : SocketCur->Active = false;
: : SocketCur->Socket->Close();
: :
: : }
: : //---------------------------------------------------------------------------
|