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;
}
}