안녕하세요. 에이루트 입니다.
현재 사용 하고 있는 모델은 W7500/W7500P을 사용 하고 있습니다.
테스트 환경은 리눅스이고, 테스트 방식은 Shell Script 방식으로 사용하고 있습니다.
W7500/W7500P모델 모두 발생 합니다.
첨부 파일(Shell_Script.zip 및 WireShark : W7500_RST_ACK.zip) 참조
테스트 방법 ./loopback.sh 회수 IP Addres delay
[ex: ./loopback.sh 10 192.168.0.192 0]
소스는 샘플 예제와 동일 합니다.
main.c
…
while(1)
{
loopback_tcps(0, test_buf, 9100);
}
loopbak.c
int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
#ifdef LOOPBACK_DEBUG
uint8_t destip[4];
uint16_t destport;
#endif
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
#ifdef LOOPBACK_DEBUG
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);
printf(“%d:Connected - %d.%d.%d.%d : %d\r\n”,sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
setSn_IR(sn,Sn_IR_CON);
}
if((size = getSn_RX_RSR(sn)) > 0) // Don’t need to check SOCKERR_BUSY because it doesn’t not occur.
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recv(sn, buf, size);
if(ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
/*
sentsize = 0;
while(size != sentsize)
{
ret = send(sn, buf+sentsize, size-sentsize);
if(ret < 0)
{
close(sn);
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
*/
}
break;
case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
//printf("%d:CloseWait\r\n",sn);
#endif
if((ret = disconnect(sn)) != SOCK_OK){
#ifdef _LOOPBACK_DEBUG_
printf("%d:CloseWait Fail:%d\r\n",sn,ret);
#endif
return ret;
}
#ifdef _LOOPBACK_DEBUG_
printf("%d:Socket Closed\r\n", sn);
#endif
break;
case SOCK_INIT :
//#ifdef _LOOPBACK_DEBUG_
//printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
//#endif
if( (ret = listen(sn)) != SOCK_OK){
#ifdef _LOOPBACK_DEBUG_
printf("%d:Listen, TCP server loopback, port [%d]--> Fail:%d\r\n", sn, port,ret);
#endif
return ret;
}
#ifdef _LOOPBACK_DEBUG_
printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
#endif
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:TCP server loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn){
#ifdef _LOOPBACK_DEBUG_
printf("%d:Socket open Fail:%d\r\n",sn,ret);
#endif
return ret;
}
#ifdef _LOOPBACK_DEBUG_
printf("%d:Socket opened\r\n",sn);
#endif
break;
default:
break;
}
return 1;
}
검토 부탁 드립니다.
수고하세요
Shell_Script.zip (647 바이트)
W7500_RST_ACK.zip (2.3 KB)