W5500 재접속 관련문의

안녕하세요

W5500(tcp/ip) 를 이용해서 센서에서 data를 받고 있는데요.
이더넷 케이블을 뺏다가 다시 연결하면 재접속이 안되는 현상이 발생합니다.
code는 “Loopback” 을 참고로 했습니다.

main.c 에서

while (1)
{

// init tcps..
tcpc(0, gDataBuf, (uint8_t *)&Server_IP, 3046);

}

tcp.c

/* TCP Client /
int32_t tcpc(uint8_t sn, uint8_t
buf, uint8_t* dest_ip, uint16_t dest_port)
{
int32_t ret; // return value for SOCK_ERRORs
uint16_t size = 0, sentsize=0;

switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
setSn_IR(sn, Sn_IR_CON);
}

     //////////////////////////////////////////////////////////////////////////////////////////////
     // Data Transaction Parts; Handle the [data receive and send] process
     //////////////////////////////////////////////////////////////////////////////////////////////
 if((size = getSn_RX_RSR(sn)) > 0)
     {
        if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; /
        ret = recv(sn, buf, size); 
        memcpy(ReceivedRadarData, buf, 47);
        if (ReceivedRadarData[0] == 0x7E)
        {
            if (ReceivedRadarData[1] == 0x16)
            {
                rcvDataFlag = 1;
                TIM1_Counter = 0;
            }
        }           
        if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
        size = (uint16_t) ret;
        sentsize = 0;
     }
	
     break;

  case SOCK_CLOSE_WAIT :

     if((ret=disconnect(sn)) != SOCK_OK) return ret;
     break;

  case SOCK_INIT :
	 if( (ret = connect(sn, dest_ip, dest_port)) != SOCK_OK) return ret;	
     break;

  case SOCK_CLOSED:
	  close(sn);
	  if((ret=socket(sn, Sn_MR_TCP, dest_port, 0x00)) != sn){
     return ret;
    } 
     break;
  default:
     break;

}
return 1;
}

ethernet cable이 빠져 있는 상태에도 “SOCK_ESTABLISHED” 로 계속 들어 갑니다.
어느 부분을 CHECK해 봐야 할까요?

W5500 does not close socket if sees cable disconnected. The advantage of this behavior is when cable is unplugged for short time and then plugged back, all the connections continue to operate (unless some specific events happen).

You see this behavior. W5500 socket keeps being established after cable reconnection. This is not a bug - it is a feature :slight_smile:

The socket will change its state in the following scenario - you unplug the cable, try to send some data to the peer, data will be undeliverable (cable is unplugged) and after time out period W5500 auto-closes the socket with time-out condition. You can turn internal chip auto-keep-alive functionality to regularly probe the network or perform regular probing (‘pinging’ remote device) connection by yourself.

If you are very bothered by the cable reconnections - for example for security reasons when W5500 is not physically secure and anyone can physically put man-in-the-middle device, then as soon as you see cable disconnect, forcefully close all the sockets at W5500 side and start reconnecting.

안녕하세요
답변이 늦었습니다.

@Eugeny 가 말한것과 같이, TCP 동작중 이더넷 케이블을 제거한다고 하더라도, 내부에서 발생하는 Timeout시간보다 짧을 경우 계속 연결된 상태를 유지합니다. 그렇기 때문에 그문제는 버그가 아니라, 정상적인 동작입니다.

만약,TCP로 데이터를 주고 받는 상태에서 이더넷 케이블이 빠진경우
강제 Close명령을 내려서 재접속을 하도록 소스를 변경하시면 됩니다.

PHYCFGR(0x002E)의 bit '0’을 확인해서 Link 가 들어와있는지 여부를 확인해보시면 해당 동작을 실행하면 될것같습니다.
image

===========================

@Eugeny 가 잘 설명해주고 있네요 고마워요! :slight_smile:

1 Like