WIZnet Developer Forum

[W5500] SOCK_CLOSED 관련 문의 드립니다.

안녕하세요.
W5500을 이용한 전력관리 장비를 제작하여 납품 중인 개발자입니다.

해당 제품을 개발하여 올해 초 부터 양산 및 설치를 진행하고 있습니다.
설치 된 제품 중 소수의 제품에서 예상치 못한 오동작이 발생하여 문의를 드립니다.

오동작 현상은
12시간 주기로 30분간 서버로의 데이터 전송이 누락되는 현상으로,
이더넷 접속이 끊겨 발생하는 것으로 추정 됩니다.

해당 현장에 PING 테스트 장비를 추가로 설치하여 HUB 쪽 문제인지 실험을 해보았지만
HUB와의 PING 테스트에는 문제가 발견되지 않았습니다.

이와 같은 현상이 발생하는 원인으로 추측하고 있는 것은
이더넷 통신 도중 어떠한 문제 또는 원인으로 소켓이 끊어졌고,
SOCK_CLOSED 상태로 가던 도중 문제가 발생한 것이 아닌가 싶습니다.

SOCK_CLOSED로 변화하기 위해서는
SOCK_FIN_WAIT, SOCK_CLOSING, SOCK_TIME_WAIT 3가지 상태 중
1가지를 거쳐야 하는 것으로 알고있습니다.

여기서 문의 드리고 싶은 것은

  1. 기본 설정의
    SOCK_FIN_WAIT or SOCK_CLOSING or SOCK_TIME_WAIT 상태에서
    SOCK_CLOSED 상태로 변화 하기까지 소요되는시간(Time out)과

  2. 해당 상태에서 인위적으로 SOCK_CLOSED 또는 SOCK_INIT 상태로 바꿀수 있는지

  3. 제가 추측하고 있는 원인 외에 추정되는 원인이 있으신지

입니다.

감사합니다.

안녕하세요.

정확한 오동작 발생 포인트를 알지 못하기 때문에 추정되는 원인을 잘 모르겠습니다…
정말 소켓이 CLOSE가 제대로 안된 것인지, 다른 무한루프에 빠져있는 것인지 정확한 문제 파악이 필요해 보입니다.

우선 요청하신 문의에 답을 드리자면,

저희가 제공드리는 ioLibrary 내부의 socket.c 함수를 참고하시면 close, disconnect함수가 있습니다.
이 함수 내부에 Sn_IR_TIMEOUT이 세팅되어 있기 때문에 이 값을 참고하시면 됩니다.

그리고 저희 W5500칩은 칩 내부적으로 Command 동작이 이루어져야 소켓 상태가 변경됩니다.
Sn_CR 레지스터를 이용하여 세팅을 하면 칩은 그걸 받아들여 최종적으로 세팅을 하게 됩니다.
그래서 인위적으로 SOCK_CLOSED(Socket open)상태로 가기 위해서는 반드시 socket을 강제적으로 종료하시는 방법을 사용하셔서(close,diconnet함수) 다시 Socket open형태로 가셔야 Socket listen(SOCK_INIT)으로 넘어갈 수 있습니다.

감사합니다.

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