랜케이블이 단락시 tcpip 연결 상태값 문의


#1

TCPIP SERVER 로 구현된 w5100 입니다.

문의 사항은 STRESS TEST 진행중,
TCPIP 연결된 getSn_SR(ch) 값의 SOCK_ESTABLISHED (CONNECT) 상태에서
물리적으로 랜 케이블을 뺏을때 getSn_SR(ch) 함수가 SOCKET SESSION DISCONNECT 상태를 감지 하지 못하고,
계속해서 getSn_SR(ch) 값이 SOCK_ESTABLISHED 남아 있습니다.

현재 이문제로 인하여 같은 포트를 재접속 불가능 하게 되었습니다.

TCPIP CONNECT 중 랜 케이블 단락시 확인할 수 있는 방법이 무엇인지 알고 싶습니다.

관련 소스 첨부 합니다.

감사합니다.

/**
@brief loopback test using TCP(server mode)
*/
void loopback_tcps(
u_char ch /**< channel(socket) index /
)
{
int len;
//u_char * data_buf = (u_char
) TX_BUF; // 0x1100, RX_BUF = TX_BUF+TX_RX_MAX_BUF_SIZE
extern PACKET packet;
extern u_char data_buf[BUFF_SIZE];

switch (getSn_SR(ch))
{
case SOCK_ESTABLISHED:						/* if connection is established */
	if(bchannel_start[ch]==1)
	{
		Debug("%d : Connected by %s(%u)\r\n",ch,inet_ntoa(GetDestAddr(ch)),GetDestPort(ch));
		bchannel_start[ch] = 2;
	}

	if ((len = getSn_RX_RSR(ch)) > 0) 			/* check Rx data */
	{
		if (len > BUFF_SIZE) len = BUFF_SIZE;	/* if Rx data size is lager than TX_RX_MAX_BUF_SIZE */
								/* the data size to read is MAX_BUF_SIZE. */

		len = recv(ch, data_buf, len);			/* read the received data */
		

		//Debug("uart_recv %d\r\n", len);

		//check packet 
		len = ToPacket(data_buf, len, &packet);

		//Debug("ToPacket %d\r\n", len);

		if(len > 0)	{

			if(packet.SPD_ID == 0xFF || packet.SPD_ID == DeviceInfo.Spd_ID)	
			{

				len = process_packet(&packet);

				if(len > 0)	{
					len = BUFF_SIZE;
					len = ToStream(&packet, data_buf, len);
					if(len > 0)	{
						send(ch, data_buf, len);				/* send the received data */
					}
				}
			}

		}

	}
	break;



case SOCK_CLOSE_WAIT:                           		/* If the client request to close */
	Debug("%d : CLOSE_WAIT\r\n", ch);
	disconnect(ch);
	bchannel_start[ch] = 0;
	break;


case SOCK_CLOSED:                                               /* if a socket is closed */
	if(!bchannel_start[ch]) 
	{
		Debug("%d : Loop-Back TCP Server Started.\r\n",ch);
		bchannel_start[ch] = 1;
	}
	if(socket(ch,Sn_MR_TCP,6001+ch,0x00) == 0)    /* reinitialize the socket */
	{
		Debug("\a%d : Fail to create socket.\r\n",ch);
		bchannel_start[ch] = 0;
	}
	else
		listen(ch);
	
	break;
}

}


#2

W5100은 LINK 상태를 따로 확인 하지 않습니다.
LINK 상태를 확인하기 위해서는 LINKLED signal(66pin)을 MCU쪽 gpio에 연결하여 이를 Monitor 하는 방법이 있고,
주기적으로 Dummy Data를 전송하여 Timeout을 유발하도록 하는 방법이 있습니다.

LINKLED를 확인하는 방법은 MUC와 H/W적이 연결이 필요하고, signal이 Toggle되거나 Low를 유지하는 경우 LINK ON 상태이며, High를 계속 유지(최소 200ms 이상)하는 경우 LINK OFF로 판단할 수 있습니다.

S/W적인 방법은
TCP 인 경우 SEND_KEEP 명령으로 사용하여 Timeout을 유발할 수 있습니다. 이 경우 제약조건이 있으며, 반드시 데이타를 1바이트 이상 전송 후 사용가능합니다. 접속이 이후 아무런 데이타 송신업시 LINK가 끊어지는 경우는 사용할 수 없습니다.

그외 UDP인 경우 ARP timeout을 유발시킬 수 있습니다.
유효한 Gateway가 있을 경우 dummy data를 전송하여 ARP timeout이 발생하면 LINK OFF, ICMP message (Unreachable port) bit가 설정되면 LINK ON으로 판단할 수 있습니다.
유효한 Gateway가 없을 경우는 판단할 수 없습니다.

S/W적인 방법은 제약이 있으므로 H/W적인 방법을 권장합니다.