연결이 설정된 후, 어느 쪽 피어도 데이터를 보내지 않으면 네트워크로 어떤 패킷도 전송되지 않아요. TCP는 유휴 프로토콜이므로 연결이 활성 상태라고 가정해요.
연결 끊김 원인- 애플리케이션 종료: 프로세스가 끝나면 보통 FIN 패킷을 보내 상대 피어에게 연결이 종료됐음을 알려요. 하지만 프로세스가 충돌하면 이 패킷이 상대 피어로 전송된다는 보장이 없어요.
- 디바이스 종료: 디바이스가 종료되면 대부분 이에 대한 알림이 없어요.
- 네트워크 케이블 분리: 네트워크 케이블이 분리되면 라우터가 종료된 것과 같아서 데이터가 전송되지 않고 연결도 닫히지 않아요.
- 라우터 신호 손실: 애플리케이션이 라우터로부터 신호를 잃어도 연결은 계속 유지돼요.
하프 오픈 연결 끊김 감지
다음 방법을 사용해 연결 끊김을 감지할 수 있어요.
두 번째 연결
두 번째 연결을 열어 연결을 시도할 수 있지만, 더 많은 리소스를 소비하고 새 스레드를 만들어야 한다는 등의 단점이 있어요. 또한 상대 피어가 재부팅된 경우 두 번째 연결은 작동하지만 첫 번째 연결은 작동하지 않아요.
상대 피어에 핑 보내기하프 오픈 연결로 핑이나 어떤 메시지를 보내도 오류가 발생하지 않아요.
TCP 소켓 수준에서 KeepAlive 활성화TCP Keep-Alive 패킷은 단순히 연결의 현재 시퀀스 번호보다 1 작은 시퀀스 번호로 설정된 ACK예요. 이러한 ACK 중 하나를 받은 호스트는 현재 시퀀스 번호에 대한 ACK로 응답해요. Keep-Alive는 연결의 원격 끝에 있는 컴퓨터가 여전히 사용 가능한지 확인하는 데 사용할 수 있어요. TCP 연결을 통해 다른 데이터나 상위 수준 Keep-Alive가 전달되지 않은 경우, TCP Keep-Alive는 TCPKeepAlive.Time(기본값 7,200,000밀리초 또는 2시간)마다 한 번씩 보낼 수 있어요. Keep-Alive에 응답이 없으면 TCPKeepAlive.Interval초마다 한 번씩 반복돼요. KeepAliveInterval의 기본값은 1000밀리초예요.
연결별로 KeepAlive를 활성화하면 TCP 프로토콜이 연결이 활성 상태인지 확인할 수 있어요. 연결이 끊긴 상태(예: 네트워크 케이블을 분리한 경우)를 감지하려면 이 방법이 권장돼요. sgcWebSockets 4.3.7부터 TCPKeepAlive 속성을 활성화해 이러한 하프 오픈 연결을 감지할 수 있어요.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
