WIZnet Developer Forum

[W5300] SYN 전송에 관한 질문 입니다

안녕하세요 현재 W5300을 TCP통신 Client로 하여 Server에 접속하면 Client에서 데이터 전송 후 Server와 데이터를 주고 받는 형식의 구조입니다

그런데 Server에 접속을 한 후 Client가 최초 데이터를 전송을 하고 Server에서 응답의 받고

다음 데이터 전송을 한 후 Server에서 응답 데이터를 전송하지 않아 wireshark로 데이터 상황을 보니

Client에서 SYN 전송하지 않는 것을 확인 하였습니다

그래서 W5300의 Sn_SSR 확인을 하니 SOCK_SYNSENT 동작은 하지 않고 바로 SOCK_ESTABLISHED가

동작을 하던데 원래 이러한 것인지 아니면 잘못 된 것인지 궁금합니다

아래 코드는 connect 코드 입니다

int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port)
{
	
	
	if(((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) ||
      ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
      (port == 0x00) 
   )
  {
      return 0;
  }
	
	setSn_DIPR(sn, addr);
	setSn_DPORTR(sn, port);
	
	setSn_CR(sn, Sn_CR_CONNECT);
	int a = getSn_IR(sn);
	while(!getSn_IR(sn))
	{
		setSn_CR(sn, Sn_CR_CONNECT);
		a = getSn_IR(sn);
		HAL_Delay(1000);
	}		
	
	while(getSn_CR(sn));

	
	uint16_t SSR_Check = getSn_SSR(sn);
	uint8_t timeout_ = 0;

	while(SSR_Check != SOCK_SYNSENT)
	{
		SSR_Check = getSn_SSR(sn);
		printf("GetSn_SSR Check [%x]\n", SSR_Check);
		/*if(SSR_Check == SOCK_ESTABLISHED)
		{
			printf("Connect Request Success\n");
			break;
		}*/
		if((getSn_IR(sn) & Sn_IR_TIMEOUT) || timeout_ > 50)
		{
			printf("Connect Request Timeout\n");
			setSn_IR(sn, (Sn_IR_TIMEOUT));
			return SOCKERR_TIMEOUT;
		}
		timeout_++;
		HAL_Delay(100);
	}
	printf("GetSn_SSR Check [%x]\n", SSR_Check);

	return 1;
}

안녕하세요

우선 이부분에서 데이터를 전송하고 응답을 받았다고 하셨는데, 어떻게 확인하신건가요? Connect가 되지않았는데 데이터 전송은 불가합니다. 보내주신 캡쳐로만 봤을때는 ARP 과정 후 SYN 패킷이 전송되는데 ARP응답을 받지 못해 전송하지 못하는것으로 판단됩니다.

TCP CLIENT에서의 Socket status는 CLOSED -> INIT -> SYN_SENT -> ESTABLISHED가 정상 동작입니다. 다만 SYN_SENT의 경우 SYN 을 전송하고 SYN,ACK을 받기까지 순간적으로 나타나는 상태이기 때문에 위와 같은 코드에서는 확인하시기 어렵습니다. 또한 ARP응답을 받지못하는경우에는 SYN을 전송하지 못하기때문에 SYN_SENT 상태가 되지않습니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.