TCP/IP Connection Established 상태에서

#1

제가 실험을 계속 해 보고 있습니다만, 소켓 연결만 잘 되면 Data는 잘 보내지고 있는 듯 합니다.
도움에 감사드립니다.

그런데, 클라이언트나 서버 한쪽의 전원이 나갔다 들어와서 리셋이 된 경우에는 오류가 나는 듯 합니다.

제가 실험해 본 결과, 서버에서 Disconnect을 할 경우 클라이언트(기기)는 SOCK_CLOSE_WAIT상태가 되는데,
매뉴얼 대로 이럴 경우는 disconnect를 해 주면 되는 것 같습니다.
클라이언트에서 disconnect할 경우에도 SOCK_CLOSED상태로 잘 빠져 나가는 듯 합니다.

문제는 클라이언트의 전원이 나갔다가 들어오는 등 시스템이 Reset 되면 다시 Socket을 생성하고 Connection을
시도하는데, 이게 안되더군요. 제가 보기에, 서버에서는 아직 Close가 안 된 상태에, 더 정확히는 Established
삳태에 놓여 있기 때문에 안되는 것 같습니다. 서버가 Listen 상태일 경우에만 connect 작업이 가능하니까요.

또한 서버에서 갑자기 호스트 프로그램을 중단해 버리거나 했다가 다시 실행시키는 경우에도 문제가 될 수
있습니다.

조언 부탁드립니다.

#2

[quote]문제는 클라이언트의 전원이 나갔다가 들어오는 등 시스템이 Reset 되면 다시 Socket을 생성하고 Connection을
시도하는데, 이게 안되더군요. 제가 보기에, 서버에서는 아직 Close가 안 된 상태에, 더 정확히는 Established
삳태에 놓여 있기 때문에 안되는 것 같습니다. 서버가 Listen 상태일 경우에만 connect 작업이 가능하니까요.
[/quote]
서버가 응답하지 않는 경우 재전송에 의해 접속을 성공하거나 Timeout이 발생하게 됩니다.
Client 재부팅 이후 접속이 잘 안되는 것은 추측컨데 Client의 소스 포트를 이전에 접속했던 것을 사용해서 서버가 접속을 안받아줄 가능이 높습니다.

일반적으로 Client의 소스포트 넘버는 Random 포트 넘버를 사용토록 권장하고 있습니다.
시스템이 재부팅될 경우 Random 시드가 동일 값을 가지므로, 이전에 사용되었던 포트 넘버가 사용될 수 있습니다.
이를 해결하기 위해선 마지막 포트 넘버를 저장하고 그이후 이값을 참조하여 다른 포트값을 생성하여야 합니다.
비휘발성 Data memory에 현재 사용값을 저장해두고, System이 재부팅되거나 다시 접속을 할 경우 이값에 1을 증가시킨 값을 사용하면 해결될수 있습니다.