w5200 랜케이블 제거시 문제

#1

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: 
    }
Tcp 접속 끊어진후 시간 경과후 재접속 에러
#2

랜케이블을 제거 한다고 SOCK_ESTABLISHED 상태가 달라지는 것은 아닙니다.
랜케이블이 일시적으로 빠졌다가 다시 연결하였을 때 Socket을 close한다면 또 다른 문제가 발생하게 될 겁니다.
이런 경우에 사용하는 기능이 Keep alive 기능입니다.

Keep alive 기능은 상대방 소켓과 dummy data를 주고 받으면서 소켓 연결에 물리적, 논리적 문제가 있는 지를 확인하는 것입니다. 지정된 Keep alive timeout 시간 동안 dummy data 송수신이 이루어지지 않으면 소켓 연결이 사실상 끊어졌다고 보고 W5200 내의 해당 소켓을 강제로 close하면 위와 같은 문제를 해결할 수 있습니다.

#3

현재 저희 통신 방식이 서버에서 메시지 요청할 경우에만 클라이언트에서 응답하는 구조입니다.
따라서 서버에서 요청이 없을 경우에는 응답 하지 않고 대기 상태를 유지 합니다.

  1. keep alive timeout이 클라이언트에서 메시지 보낼 경우에만 발생하는 것인가요?

  2. 저희와 같은 상황에서는 서버에서 일정시간 동안 요청이 없을 경우 강제로 소켓을 close하는 방법 밖에없나요?

#4
  1. 네. Keep alive 패킷을 클라이언트에서 전송해야 timeout interrupt가 발생합니다.
    timeout interrupt가 발생하면 status가 close로 바뀌게 됩니다.

또한 keep alive 뿐만 아니라 다른 패킷을 전송하더라도 lan 케이블이 연결이 되어 있지 않는다면 ack를 받지 못하므로 timeout interrupt가 발생하며 status가 close로 바뀌게 됩니다.

  1. 처음 질문이 lan케이블이 끊어 지는 경우와 같은 상황에서의 예외처리를 물어보셨는데요.
    dummy 패킷을 보내거나 keep alive packet을 보내서 연결상태를 보고 close 하는 방식으로 하면 될것 같습니다.

그런데 2번 질문은 close 하지 않고 예외처리를 하는 방법을 물어보신건지 궁금합니다.