W5100 UDP 사용시 ARP 동작관련

[W5100]
사용 중인 제품 명을 위와 같이 제목에 명기하시면 더 빠른 응답을 받으실 수 있습니다.
본 Template을 삭제 후 문의 내용을 남겨 주세요. :slight_smile:

안녕하세요. 현재 W5100을 이용하여 UDP를 통해 서버가 살아있는지 체크하는 부분을 만들고 있습니다.

현재 확인한 바로는, UDP로 특정 아이피에 UDP를 쏠 경우 Sn_IR 레지스터로 Send_OK 가 날아오는것을 확인할 수 있었습니다.

그리고 제가 이해한 W5100 ARP 메커니즘으로, sendto 를 하면서 ARP를 보냄으로 ARP 테이블이 해당 값으로 초기화되면서 보낸 그 IP에 해당하는 ARP가 업데이트되어, 그 망이 끊어져도(랜선을 뽑는다는등) 계속해서 Send_OK가 뜨는것을 확인하였습니다.

그래서 이를 해결하기위해 해당 IP로 데이터를 보낸 후 바로 다른 IP로 다시 UDP 데이터를 보냄으로써 ARP 테이블을 초기화시키자 랜선이 끊어졌을 시 TIMEOUT이 뜨는걸 확인할 수 있었습니다.

이러한 작업은 3초에 한번씩 하도록 해두었는데, 문제는 외부망이 끊어졌을 경우입니다.

허브를 통해서만 mcu(w5100이연결된)와 서버쪽 pc가 랜선으로 연결되어있을 시, 외부망을 사용하지 않을시인데,

이 때에 mcu에서 pc쪽 IP로 UDP 데이터를 쏘면 Send_OK가 뜨지만 외부망이 끊긴 내부망으로만 연결된 상태에서는 다른 IP로 UDP를 쏠 씨 ARP 초기화 즉 업데이트가 되지않습니다. 원래 ARP 메커니즘이 이러한가요?

저희가 사용하는 제품은 외부망이 연결되지 않고 내부망으로만 연결되는데, 보통 장비와 pc쪽 아이피가 한개씩 연결되어서

pc쪽 IP : 192.168.1.10
mcu쪽 : 192.168.1.11

이런식으로 두개의 아이피만 사용하게 됩니다. 그래서 19.2168.1.12 등으로 더미데이터를 보낼 시 UDP ARP가 초기화가 되어야 하는데, 초기화가 되지를 못하더군요…

무언가 방법이 있는지 답변부탁드립니다 !

WIZnet의 TCP/IP 칩들은 이전 ARP 정보를 가지고 있습니다. 그래서 다음번에 sendto 를 호출 할 때, 이전과 동일한 IP로 보내는 경우라면 ARP를 수행하지 않습니다.
Destination이 동일한 IP라도 매번 ARP를 보내도록 하고 싶으면 Sendto() 호출후에 반드시 해당 소켓을 Close하고, 다시 Sendto()를 해야할 때, Socket() 오픈을 먼저하고 Sendto(), Close()의 순서를 지키시기를 바랍니다.

javakys