소켓 connect 관련 문의드립니다

w5100 유저입니다.
정상적으로 서버(MCU)와 클라이언트(PC GUI)가 랜케이블을 연결하여 통신중에 랜케이블을 뽑으면
서버측에서 소켓을 놓치는 것 같습니다.
디버거로 확인시 서버측에서는 LISTEN은 유지하고 있습니다.

케이블 오픈 후 10초정도 TIME OUT 후에는 클라이언트를 아무리 재실행 시켜도 연결이 안되네요
단, 서버를 리셋하면 정상 연결이 됩니다. 여기서 리셋의 의미는 IP,MAC등을 재 설정하여 LISTEN을 한다는 의미입니다.

통신 중에 인위적으로 케이블 오픈등으로 FAIL을 발생시키면 일정시간(약 10초)뒤에 서버측에서는 뭔가 오동작을
하는것 같습니다.

APP단에서 보완작업을 해줘야하는지 문의드립니다.

Client socket을 Open할 때 Port number는 랜덤으로 생성하셔야 합니다.
고정 값으로 설정할 경우, 서버측에서 이전 Socket과의 재 연결로 인식하여 연결이 제대로 되지 않을수 있습니다.
이부분 확인바랍니다.

[quote=“midnightcow”]Client socket을 Open할 때 Port number는 랜덤으로 생성하셔야 합니다.
고정 값으로 설정할 경우, 서버측에서 이전 Socket과의 재 연결로 인식하여 연결이 제대로 되지 않을수 있습니다.
이부분 확인바랍니다.[/quote]

랜덤 포트가 이해가 안가네요… 서버측은 포트 5000번으로 고정되어있는데 클라이언트가 랜덤으로 포트를 설정한다면 연결이
안되지 않나요??
만약 답변내용처럼 구현한다면 비정상적인 클라이언트 종료시 서버측에서 세션을 delet할 수 있는 것이겠군요…

Client socket의 port number를 랜덤을 해도 연결이 되는것은
TCP의 3way handshake와 연관됩니다.

  • Client에서 Server로 접속을 하기 위해서는 3way handshake가 완료되어야 합니다.
    • Client에서 Server로 SYN Packet을 보낼때 random portnumber도 같이 전송되기 때문에
      3way handshake가 완료되었다면 연결되는데에는 문제가 없습니다.
      그러므로 Client의 포트는 random port로 하는것이 맞습니다.

ekkim 님이 말씀하신 것처럼. 이론적 설명은 충분한 것 같습니다.
좀더 설명을 드리자면,
Client는 이미 서버 Port number를 알고 있어야 하고, Sever는 Client가 어떤 Port Number를 사용하는지 접속 요구(SYN) Accept 할 때 알 수 있습니다.

따라서, Client는 특별한 Case가 아닌 이상 랜덤 포트를 사용합니다.