WIZnet Developer Forum

W5500 컨넥션 관련 문의

W5500 으로 개발 진행 중입니다.

기본 제공하고 있는 Loopback 함수를 이용하여, 구성되어 있습니다.

W5500 과 PC 프로그램과 각 Client, Sever로 연결되어 있으며,

때에 따라 PC 프로그램을 종료 후 재실행 하는 과정을 반복 할 수 있습니다.

이때 Client 입장에서 연결이 끊어진것을 바로 감지 하고, 다시 연결이 되어야 하는데,

몇번 테스트 결과 아래 코드에서 if(disconnect(sn) == SOCK_OK) 를 삭제 하면, 2분이상 지속적으로 Retry 후 재접속 되나,

반대의 경우 서버와 재접속 되지 않습니다. 또한 재접속 되어도 2분 이상 소요되어 비정상적으로 보입니다.

현재 문제점에 대한 답변 부탁드리며, 추가정보에대하여 요청하시면, 정보 전달하겠습니다.

void ClientRXtcps(U8 sn) // Client
{
U32 ret;
U16 len = 0; //, sentsize=0;

int i;
U8 temp8;

switch(getSn_SR(sn))    //Sn_SR: Socket Status

{
case SOCK_ESTABLISHED :

     if(getSn_IR(sn) & Sn_IR_CON)  // #define Sn_IR_CON 0x01
     {
        printf("%d:Connect OK!\n",sn);
        setSn_IR(sn,Sn_IR_CON);    //Clear Sn_IR_CON(Interrupt Clear)

     }
   
     if((len = getSn_RX_RSR(sn)) > 0)
     {
        ret = recv(sn,RxDATABUF,len);
        if(ret <= 0) break;
         ///// 데이터 리시브 파트.............
    break;

  case SOCK_CLOSE_WAIT :
        printf("%d:CloseWait\r\n",sn);
        
      if(disconnect(sn) == SOCK_OK)printf("%d:Closed Wait\r\n",sn);  //   
        else
        {
            printf("%d:Closed Error\r\n",sn);
        }    
       break;

case SOCK_INIT :
if(connect(sn,M_API_IP_Addr,M_API_Port)==SOCK_OK)printf("%d:Connect Init\r\n",sn);
else
{
printf("%d:Connect Error\r\n",sn);
//while(1);
}
break;

  case SOCK_CLOSED:

        if(socket(sn, Sn_MR_TCP, Client_PortNumber, 0x00)==sn)
        {
            printf("%d:Socket Opened\r\n",sn);
        }
        else
        {
            printf("%d:Socket Error\r\n",sn);
           // while(1);
        } 

     break;
  default:
     break;

}
// return 1;
}

안녕하세요.

일단 코드상으로는 크게 문제가 될 건 없을 것 같은데요.

전체적인 코드를 한 번 봐야할 것 같습니다…

혹시 while문으로 사용하여 Switch문이 계속 돌게해서 각 State를 호출하는 방법을 사용해보셨나요??

아니면, 타이머를 사용해서 몇초에 한 번씩 disconnect가 되는 것을 감지하는 방법도 사용되면 괜찮을 것으로 판단됩니다.

감사합니다.

===============================================================================================================
일단 코드상으로는 크게 문제가 될 건 없을 것 같은데요.

전체적인 코드를 한 번 봐야할 것 같습니다…

혹시 while문으로 사용하여 Switch문이 계속 돌게해서 각 State를 호출하는 방법을 사용해보셨나요??
==> while(1)

  { 

     ClientRXtcps(0);

  }  

  형태로 사용하고 있습니다. 

아니면, 타이머를 사용해서 몇초에 한 번씩 disconnect가 되는 것을 감지하는 방법도 사용되면 괜찮을 것으로 판단됩니다.
==> 현재 서버와 3초에 1회 주기적으로, 연결되어 있는지 지속적으로 통신체크 하고 있습니다.

 이것을 타이머로 체크하여, 끊어졌다 판단되면,( 재접속이 원하는 시간내에 되지 않아) MCU를 리셋하는 방법을 사용하고 있습니다.

==>문의 사항: Disconnect 감지한뒤 바로 재접속시도를 하고자 하면, 어떤 방법을 취해야 됩니까.?

  • 현재 이더넷이 연결된 상황에서는 제가 원하는모든 기능은 원활히 동작 하고 있으며, 단 끊어졌을때 재접속시 시간이 오래 걸린다는 문제가 있다 생각됩니다.
    ===============================================================================================================

안녕하세요.

결론부터 말씀드리자면,

if(disconnect(sn) == SOCK_OK)printf("%d:Closed Wait\r\n",sn); 이 부분 이외에

Sn_IR_TIMEOUT도 같이 추가로 확인해보세요.

제공드린 iolibrary를 확인하시면 disconnect함수에 Sn_IR_TIMEOUT 조건문이 있습니다.

  1. 현재 구성하신 Client가 Server와 연결하여 동작중인 과정에서 만약 Server가 아무런 명령도 없이

종료가 되었다고 가정했을 때, Client는 Server로 부터 아무런 명령을 못받으면 계속 Established 상태가

되어있습니다. 위와같은 상태가 지속될 경우, Client가 Data를 Server측으로 보내고, 만약 Server로 부터 응답이 없으면, Sn_IR_TIMEOUT을 사용하여

연결을 끊고 다시 연결을 하게 구성하시면 될 것 같습니다.

  1. 다른 경우, Server측에서 Close를 보내면 Client는 Close wait으로 접어들게 되고, Client에 아직 남아있는 데이터를 전부

Server로 보낸뒤에 Close 상태로 변하게 됩니다.

그렇기 때문에 만약 Client가 Close가 된다면, 다시 Connect하라는 함수도 같이 추가 해주시면 될 것 같습니다.

위 두가지 방법을 사용해서 다시 한번 구성해주시기 바랍니다.

감사합니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.