C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74892] Re:Re:TCP/IP 소켓 통신 관련 질문
newrise [youkdy6] 3748 읽음    2018-04-18 20:02
먼저, 답변 감사합니다.
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();
: :  
: : }
: : //---------------------------------------------------------------------------

+ -

관련 글 리스트
74890 TCP/IP 소켓 통신 관련 질문 newrise 3604 2018/04/17
74891     Re:TCP/IP 소켓 통신 관련 질문 라스코니 3461 2018/04/18
74892         Re:Re:TCP/IP 소켓 통신 관련 질문 newrise 3748 2018/04/18
74893             Re:Re:Re:TCP/IP 소켓 통신 관련 질문 라스코니 4106 2018/04/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.