WIZnet Developer Forum

W5300 Chip을 이용한 UDP 통신 관련 질문입니다.

UDP 통신을 이용하여 W5300 Chip을 사용한 장비에서 복수의 IP로 정보를 전달하는 프로그램을 작성하고 있습니다.

예)
포트 번호는 동일하게 30000 번을 사용.
송신측 192.168.0.10
수신측 192.168.0.30, 192.168.0.40, 192.168.0.50

192.168.0.10에서 192.168.0.30으로 Packet을 반복 전송할 경우는 아무런 에러없이 통신이 잘됩니다.
또는 192.168.0.40, 192.168.0.50으로도 역시 에러없이 통신이 됩니다.

하지만…

192.168.0.30으로 packet을 한번 보내고나서 바로 192.168.0.40으로 전송을 하면 sendto() 함수에서 -13이 반환됩니다. 전송타임아웃이더군요.

즉, 192.168.0.10에서 192.168.0.30으로 보낸후 바로 다른 아이피(192.168.0.40 또는 192.168.0.50)로
packet을 보내면 -13 에러가 나는데 해결할 방법이 있는지요?

감사합니다;

UDP 통신의 경우 Destination IP Address가 변경될때마다 ARP 를 요청합니다.
Timeout은 ARP에대한 response를 받지 못할 경우 발생됩니다.
192.168.0.30과 192.168.0.40 은 어떤 장치인가요??
Wireshark를 통해 위와 같은 상황에서 ARP Response가 잘 되는지 확인부탁드립니다.

192.168.0.30과 192.168.0.40 은 어떤 장치인가요?? <---- PC 장비입니다.

W5300을 초기화 할때 ARP 사용하도록 하는 설정값이 혹시 있는지요?
초기화시에 W5300 제공 소스를 사용했습니다.

감사합니다.
받는 장비에 Wireshark을 설치할 수 없어서 별도로 테스트프로그램을 작성해서 타 장비에서 테스트를 진행하려합니다.

w5300은 별도의 ARP 테이블이 없기때문에 IP가 변경될시 무조건 ARP를 진행하게되어있습니다. 별도의 설정값은 없습니다.

다만, Sn_DHAR에 MAC주소를 저장한후 SEND Command 대신에 SEND_MAC Command로 데이터를 전송할 경우 ARP를 진행하지 않습니다.

다시 질문드립니다.

UDP 송신 … sendto 함수 사용.

192.168.0.30으로 packet을 전송하고, 바로 192.168.0.40으로 전송을 하면 -13 에러가발생합니다.

에러 발생하는 경우가… 192.168.0.30 장치가 Power OFF 된상태 인경우이고, 192.168.0.40 장치는 Power On이 되어 있는 경우입니다.

이경우 30, 40번 모두 에러가 발생하네요.

또한 30번으로 전송하지 않고 Power가 ON 되어 있는 40번, 50번 아이피로 전송을 하면 정상동작합니다.

어떤걸 조절? 하면 Power OFF 된 장비에 자료 전송을 해도 그장치만 에러가 나고 다음 으로 전송하는 장비는 에러가 나지 않을까요?

감사합니다

해당 증상은 Firmware 적인 문제로 보입니다.
첫번째 sendto()에서 error가 나더라도 다음 전송시에는 정상적으로 전송됩니다.
펌웨어적으로 sendto에서 error를 return했을때 다음 sendto()가 동작하지 않도록 구현된것으로 추측됩니다.
아래 테스트한 코드와 디버깅 메시지 공유해드립니다. 참고하시기 바랍니다.
저의 환경의 경우 192.168.0.232는 Power On, 192.168.0.7은 Power off 된 장비라고 보시면 됩니다.

image
image

결론적으로 아이피를 바꿔가면서 연속으로 UDP Packet을 전송할 수 없는 거죠?

가능합니다
위에서 저는 192.168.0.7 과 192.168.0.232에게 번갈아가며 send하였습니다.

같은 시험을 해도 저는 -13에러가 납니다.

어떤 부분에서 제가 실수를 하거나 놓친 부분이 있을까요?

어떤 자료가 있어야 확인을 해볼수 있는 지요?

감사합니다;

유의할점은 IP를 변경하여 Send할경우에만 ARP를 전송한다는점입니다.
예를들어 전원이 OFF되어있는시점에 dest A로 sendto()를 전송하고
이후에 전원을 ON 하더라도 dest 가 변경된적이 없다면 ARP가 다시 전송되지않기때문에 Timeout이 발생됩니다.

네… 전원을 OFF, ON 하면서 테스트하는것은 아닙니다.

수신쪽(예를 들어 3대의 수신장비)에 전원이 모두 ON 된 상태에서 정상적인 통신을 하고 있다가 하나의 장비 전원이 OFF되는 경우 나머지 두개의 장비가 모두 -13 에러가 계속 발생이 되는것 때문입니다.

초기화및 W5300 제공파일도 함께 보내드립니다.
검토좀 부탁 드립니다.

감사합니다.socket_test.zip (45.4 KB)

아이피를 변경할 경우면 한번 사용한 아이피인경우는 ARP 요청을 하지 않는건가요?

첫 ARP 진행 후에는 다시 ARP를 시도하지않으며, 다른 destination으로 전송하였다가 다시 전송할 경우 ARP를 전송합니다.

예를들어

  1. send Dest A (ARP 전송)
  2. send Dest B (ARP 전송)
  3. send Dest B
  4. send Dest A (ARP 전송)
  5. send Dest A
  6. send Dest B (ARP 전송)
    위의 순서로 데이터를 전송할 경우 ARP를 전송하는 시점은 위와같습니다.

1 과같은 환경에서는 정상작동한다고 하시지않으셨나요?
패킷상으로 볼때, 1번에서 112는 101에 대한 ARP를 계속 재전송하고 있습니다.
덤프이기 때문에 확실하진 않지만 101에서 ARP Response를 주지않는것으로 추측됩니다.
111로 전송은 안하는 것으로 보여집니다.

위에글에서는 2번과 같은 환경에서 error가 발생한다고하셨었는데 1번에서는 OFF된 device가 없는데 타임아웃이 발생한다는 말씀이신가요?

이상황 저상황 시험하다가 꼬인것같네요.

다시 시험한 내용은 이렇습니다.

112번 장비에서 Data 전송. 순서는 101, 220, 111 순서 입니다.
2초주기로 3개의 장비에(101, 220, 111) Data를 동시에 전송합니다.
101, 220, 111 번 장비 모두 켜져있는 경우
sendto ok… (0:ret=18, len=18, ip=101)
sendto ok… (0:ret=18, len=18, ip=220)
sendto ok… (0:ret=18, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto ok… (0:ret=18, len=18, ip=220)
sendto ok… (0:ret=18, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto ok… (0:ret=18, len=18, ip=220)
sendto ok… (0:ret=18, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto ok… (0:ret=18, len=18, ip=220)
sendto ok… (0:ret=18, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto ok… (0:ret=18, len=18, ip=220)
sendto ok… (0:ret=18, len=18, ip=111)

112번 장비에서 Data 전송. 순서는 101, 220, 111 순서 입니다.
101, 111 번 장비 켜져있고, 220 장비 Power Off 상태

sendto ok… (0:ret=18, len=18, ip=101)
sendto error… (0:ret=-13, len=18, ip=220)
sendto error… (0:ret=-13, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto error… (0:ret=-13, len=18, ip=220)
sendto error… (0:ret=-13, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto error… (0:ret=-13, len=18, ip=220)
sendto error… (0:ret=-13, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto error… (0:ret=-13, len=18, ip=220)
sendto error… (0:ret=-13, len=18, ip=111)
sendto ok… (0:ret=18, len=18, ip=101)
sendto error… (0:ret=-13, len=18, ip=220)
sendto error… (0:ret=-13, len=18, ip=111)

좀 불규칙적인 에러가 발생 하지만 Data 전송 시작인 101은 대부분 전송됩니다.

이상입니다.

혹시 송,수신 인터럽트에서 setSn_IR( ); 처리하는 부분과 sendto 함수에서 setSn_IR( ); 함수 처리하는것 때문에 발생하는 문제일까요?

위의 상황에서 111를 PC또는 노트북으로 변경하여도 동일한 상황인지 확인하면 좋을것 같습니다.
또한, 위의상황에서 Wireshark를 dump하여 W5300이 220과 111모두에게 ARP를 전송하고있는데 Timeout이 나는것인지(첫번째경우-110이 ARP Response를 주지않는경우, 두번째경우-110이 Response를 주지만 W5300이 이를 인지하지 못하는 경우), W5300에서 111로 ARP를 전송하지 않는것인지(세번째 경우) 확인하면 좋을것같습니다.
저희 환경에서는 상황이 재현되지 않아서 정확한 원인을 알아야 빠른 해결이 가능할 것 같습니다.
감사합니다.

발생되는 원인을 찾았습니다.

setSn_TX_WRSR(sn, len);		// set len
setSn_CR(sn,Sn_CR_SEND);	// set Send Command
/* wait to process the command... */
while(getSn_CR(sn));		//

while(1)
{
	tmp = **getSn_IR(sn);**
	if(tmp == 0)
	{
		tmp = sock_sendIR[sn];
	}
	if(tmp & Sn_IR_SENDOK)
	{
		setSn_IR(sn, Sn_IR_SENDOK);
		break;
	}
	else if(tmp & Sn_IR_TIMEOUT)
	{
		setSn_IR(sn, Sn_IR_TIMEOUT);
		#if _WIZCHIP_ < 5500
		if(taddr) setSUBR((uint8_t*)&taddr);
		#endif
		return SOCKERR_TIMEOUT;
	}
}

sendto 함수에서 Packet을 전송하라는 명령을 Chip에 Write한 후에 getSn_IR(sn) 함수를 호출하여 Send OK 또는 Time Out을 체크하는 중에…
인터럽트 서비스 루틴에서 IR 값을 읽어서 처리해서 발생하는 문제였습니다.

Sendto 함수와 Interrupt 서비스 루틴에서 getSn_IR() 함수처리를 잘처리하면 될것 같습니다.

감사합니다.

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