빠른 답변 감사 드립니다.
Server ip 192.168.0.3
w5500 ip 192.168.0.80
ip client mode로 사용
w5500 side 에서 1초 한번씩 Packet길이를 1개씩 증가 하면서 서버로 보내는 시험을 하였습니다.
Connection_tcpc 함수와 send 함수를 아래 처럼 만들었습니다.
Connection_tcpc 함수는 20ms 마다 주기적으로 호출 되도록 하였고, send 함수는 다른 task에서 보내는 구조 입니다.
int Connection_tcpc(unsigned char sn, uint16 port)
{
int32_t ret; // return value for SOCK_ERRORs
uint16_t size = 0, sentsize=0,destport;
unsigned char tcpc_Server_destip[4];
// Port number for TCP client (will be increased)
uint16_t any_port = ALARM_CLIENTPORT;
// Socket Status Transitions
// Check the W5500 Socket n status register (Sn_SR, The ‘Sn_SR’ controlled by Sn_CR command or Packet send/recv status)
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON) // Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
{
ch_status[sn] = 2;
IP_Connect_Led(YES);
#ifdef LOOPBACK_DEBUG
getSn_DIPR(sn, tcpc_Server_destip);
destport = getSn_DPORT(sn);
printf(“%d: tcpc Connected to - %d.%d.%d.%d : %d\r\n”,sn, tcpc_Server_destip[0], tcpc_Server_destip[1], tcpc_Server_destip[2], tcpc_Server_destip[3], destport);
#endif
setSn_IR(sn, Sn_IR_CON); // this interrupt should be write the bit cleared to ‘1’
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Data Transaction Parts; Handle the [data receive and send] process
//////////////////////////////////////////////////////////////////////////////////////////////
if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
ret = recv(sn, RX_BUF, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
}
//////////////////////////////////////////////////////////////////////////////////////////////
break;
case SOCK_CLOSE_WAIT :
#ifdef LOOPBACK_DEBUG
printf(“%d:CloseWait\r\n”,sn);
#endif
if((ret=disconnect(sn)) != SOCK_OK) return ret;
#ifdef LOOPBACK_DEBUG
printf(“%d:Socket Closed\r\n”, sn);
#endif
break;
case SOCK_INIT :
if(Server_Monitoring_Req == TRUE) // Server에서 요청된 Port로 접속
{
if( (ret = connect(sn, Server_destip, Server_Monitoring_Port)) != SOCK_OK) // Server_Monitoring_Port 5062
{
return ret; // Try to TCP connect to the TCP server (destination)
}
Server_Monitoring_Req = FALSE;
}
else
{
if( (ret = connect(sn, Server_destip, Server_Alarm_Port)) != SOCK_OK) // Server_Alarm_Port 5061
{
return ret; // Try to TCP connect to the TCP server (destination)
}
}
break;
case SOCK_CLOSED:
close(sn);
ch_status[sn] = 0;
IP_Connect_Led(NO);
#ifdef LOOPBACK_DEBUG
printf(“%d:Socket closed\r\n”,sn);
#endif
break;
default:
break;
}
return 1;
}
int IP_Send(unsigned char sn, uint8 * buf, uint16 len, char retry)
{
uint16 RSR_len;
int Snd_PktLength,Rcv_PktLength,tmp_retry_cnt;
int received_len,size,ret,sentsize;
//printf("IP_Send=> getSn_RX_RSR(s)) =%d\r\n",getSn_RX_RSR(s) );
if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
ret= recv(sn, RX_BUF, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
}
sentsize = 0;
size = len;
while(size != sentsize)
{
ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
if(ret < 0) // Send Error occurred (sent data length < 0)
{
printf("Error Send size=%d\r\n",ret);
close(sn); // socket close
return ret;
}
else
{
os_delay(2);
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
printf("Success Send size=%d\r\n",ret);
continue;
}
printf(".");
}
return ret;
}
wireshark 8 번에서 부터 1…2…3…4…5 ~ 102까지 잘 진행 되다가 SOCK_CLOSED 로 갑자기 가 버립니다.
filter 적용하여 wireshark file 다시 첨부 했습니다.
capture 20170222-3.txt (23.8 KB)