w5200을 사용중입니다.
제품이 클라이언트로 동작하고 PC가 서버로 동작하는 구성입니다.
정상적인 접속/종료시에는 잘 동작하지만 비정상적으로 강제 종료(연결된 lan케이블 제거)할 경우
예외처리가 잘 되지 않아 문의 드립니다.
아래와 같은 예제 소스로 loopback 테스트를 하였습니다.
서버에서 정상적으로 접속 종료를 한 후 다시 대기상태로 하면 클라이언트가 재접속을 정상 적으로 진행 합니다.
그런데 정상적으로 접속 된 상태에서 연결된 lan 케이블을 제거 하였을 경우에 예외처리가 잘 되지 않습니다.
확인 해본 결과 아래와 같은 예제 소스에서 상태레지스터값을 읽어 처리하는데 lan 케이블을 제거 하였을 경우에도SOCK_ESTABLISHED 상태를 벗어 나지 못하여 재접속을 시도 하지 않습니다.
이럴 경우 좋은 처리 방법이 있는지 문의 드립니다…
switch (getSn_SR(s))
{
case SOCK_ESTABLISHED: /* if connection is established */
case SOCK_CLOSE_WAIT: /* If the client request to close */
case SOCK_CLOSED:
case SOCK_INIT:
}
랜케이블을 제거 한다고 SOCK_ESTABLISHED 상태가 달라지는 것은 아닙니다.
랜케이블이 일시적으로 빠졌다가 다시 연결하였을 때 Socket을 close한다면 또 다른 문제가 발생하게 될 겁니다.
이런 경우에 사용하는 기능이 Keep alive 기능입니다.
Keep alive 기능은 상대방 소켓과 dummy data를 주고 받으면서 소켓 연결에 물리적, 논리적 문제가 있는 지를 확인하는 것입니다. 지정된 Keep alive timeout 시간 동안 dummy data 송수신이 이루어지지 않으면 소켓 연결이 사실상 끊어졌다고 보고 W5200 내의 해당 소켓을 강제로 close하면 위와 같은 문제를 해결할 수 있습니다.