[W5500] TCP 서버 상태 체크 문의

안녕하세요.
W5500 을 이용하여 서버와 클라이언트를 2개의 소켓으로 사용 중입니다.
소켓 하나로는 클라이언트 모드로 특정 조건에만 외부 서버에 접속하여 통신을하고
다른 소켓 하나로는 서버로 돌려서 외부에서 접속되는 클라이언트를 기다리고 있습니다.
서버의 경우 상태 체크를 하여 정상적으로 SOCK_LISTEN 상태로 변경되어 계속 클라이언트를 기다리고 있습니다.
평소에는 클라이언트가 잘 접속하는데 어쩔때는 클라이언트가 접속을 못하는 경우가 발생합니다.
그래서 해당 이슈 관련하여 조언을 얻고자 문의 드립니다.

  1. SOCK_LISTEN 상태에서 지금 네트워크가 정상인지 확인 할수 있는 방법이 있는지요?
  2. 위 내용에 대하여 SOCK_LISTEN 상태에서 외부로 PING을 보내 확인하려고 ping_request 를 사용하니 sendto 내부에서 무한으로 상태를 체크하는 현상이 발생합니다 (getSn_IR 상태가 0x00 로 리턴되어 Sn_IR_SENDOK 조건에 만족하지 못함)… 전에 클라이언트로 했을때는 정상 동작했었는데 서버로 하니 문제가 발생하는데요 혹시 서버로 설정된 상태에서도 핑을 보낼수 있는지 문의 드립니다.
    그럼 답변 부탁드립니다.

안녕하세요

PING의 경우 ICMP 메세지로 TCP 또는 UDP 모드에서 전송이 가능한 메세지가 아닙니다. W5500에서는 IPRAW 모드로 socket을 open하여 전송이 가능합니다.
또한 TCP의 경우 1:1 통신으로 CLIENT와 접속이 되었을때만 해당 CLIENT와 통신이 가능합니다.
따라서 TCP SERVER로는 LISTEN상태가 아니더라도 PING을 전송할 수 없으며, ESTABLISHED 상태가 되었을때만 연결된 CLIENT로 데이터를 전송할 수 있습니다.
SOCKET을 IPRAW로 하나 더 오픈하셔서 PING을 전송하셔야 합니댜.
다른 SOCKET을 통해 PING을 전송하더라도 W5500의 네트워크 상태가 확인되는 것이므로 TCP SERVER SOCKET의 네트워크 상태 또한 정상이라고 보셔도 됩니다.

아… 그렇군요…
말씀하신 방법으로 처리하여 진행해보겠습니다.
도움 감사합니다…

한가지 더 여쭤봅니다…
TCP SERVER로 LISTEN 상태에서 네트워크 정상 판단은 SOCKET을 IPRAW로 하나 더 오픈해서 PING 보내는 방법 외에는 없는것인가요??
LISTEN 상태에서 LAN 케이블을 제거해도 상태는 계속 LISTEN 상태로 나와서요…
아마 PHY LINK 부분 체크하면 위에 내용은 해결될듯한데…
실제 네트워크가 정상인지까지 확인하려면 하나 더 열어서 connect을 해보거나 아니면 PING 날리는 것 외에는 방법이 없는지해서 문의 드려봐요…

안녕하세요

W5500의 PHYCFGR 레지스터의 0번 bit를 확인하시면 LINK를 확인할 수 있습니다.
아니면 PING을 PC에서 W5500으로 전송하여 응답을 확인하는 방법도 있습니다.
W5500에서는 별도의 Socket을 open하지않아도 PING을 수신하면 자동으로 Reply를 전송합니다.

  1. LAN케이블 제거시 상태가 LISTEN상태.
    → 먼저, Server의 경우 Socket open → Listen → send or receive data-> close의 동작을 하게 되어있습니다.
    Listen 상태라는 것은 네트워크 연결과는 상관없이 저의 칩의 Client를 받을 준비가 되었다는걸 의미합니다.
    만일 Listen상태에서 케이블을 제거했을 경우 Socket Close의 상태로 가기를 원하신다면,
    위에 Becky가 말한것과 같이 아래의 register에서 Link을 확인하신 후 Sn_CR를 이용하여 Socket Close를 하시면 됩니다.
    image
    image
  2. 네트워크 정상이라는것은 어떤것을 말씀하시는걸까요?
    → 단순히 LAN연결이라면W5500의 PHYCFG Register을 확인하시면되고,
    PC<-> W5500 간의 정상적인 Network을 원하시는 거라면 W5500에 IP/MAC/Gateway/subnet mask를 올바르게 입력하신후 PC에서 Ping request를 W5500의 IP로 보내면 됩니다.

네트워크가 정상이라는 판단은 간단한 문제는 아닙니다.
다만 PHY LINK는 스위치와의 물리적 연결이 되어 있는 경우에는 정상으로 판단이 됩니다.
연결을 이루고자 하는 장치가 살아있는 지를 보려면 PING을 날리는 방법과 임의의 데이터를 보내는 방법이 있습니다.
PING request는 IPRAW 모드를 사용해야하니 UDP 소켓을 열어서 특정 IP를 지정해서 임의의 데이터를 sendto()해보세요.
sendto()전에 ARP request를 보내는 데, 수신 장치가 같은 로컬 네트워크내의 장치라면 ARP reply를 보낼 것이고 해당 장치가 통신 불가 상태라면 ARP request에 대한 Timeout이 발생할 것입니다.