2016-11-29 1 views
-1

나는 Winsock2를 사용하고 있으며, 나는 IPv4를 통해 TCP 소켓을 만들었다.다른 쪽이 인터넷 연결을 잃어 버리면 어떻게 클라이언트/서버 쪽에서 감지 할 수 있습니까?

나는 한 쪽이 연결을 끊었는지 (recv 함수의 값을 확인하는 것) 어떻게 감지 할 수 있는지 알고 있지만,면이 인터넷 연결을 잃으면 어떻게 될까?

누구나 클라이언트와 서버 모두 다른 쪽을 감지 할 수 없으므로이 방법으로 네트워크에 더 이상 연결되어 있지 않습니다.

+1

하트 비트를 사용해야합니다. 클라이언트 나 서버가 보내는 것을 중단하면 다른 쪽에서 문제가 있다고 생각할 수 있습니다. – Rama

+0

나를 더 잘 설명 할 수 있을까요? KEEP_ALIVE 옵션에 관한 것입니까? – Serusar

+0

하트 비트는 서버와 클라이언트간에 주기적으로 전송되는 일부 데이터로 구성되어 상대방이 살아 있는지 확인합니다. 간단한 태그 메시지와 타이머 논리를 사용하여 구현할 수 있습니다. – Rama

답변

0

적어도 질문을하기 전에 OSI 모델에 대해 알아야 할 수도 있습니다. TCP, IPv4는 미디어 (이더넷, 인터넷)와 공통점이 없으며 캡슐화되어 있습니다. 네가 한 말은 연결이 끊긴 경우 (반 개방 연결이라고도 함)였습니다. TCP는 3 방향 핸드 셰이크 프로세스와 4 방향 연결 종료를 사용합니다. 연결이 설정된 후에 양쪽 데이터가 전송되지 않으면 어떤 패킷도 사용 된 매체를 통과하지 못합니다. TCP는 유휴 프로토콜이며, 레벨에서 클라이언트에서 서버로 보내는 "하트 비트"메시지가 없습니다.

TCP는 탄력성과 효율성을 위해 이러한 방식으로 설계되었으므로 케이블을 분리하고 다시 꽂을 수 있습니다. 이 디자인은 연결이 여전히 존재하는지 확인하기 위해 네트워크를 통해 "폴링"패킷을 전송하지 않기 때문에 효율적입니다. 왜 실생활에서 항상 작동하지 않는 걸까요? 일반적으로 연결을 다시 초기화 한 후 클라이언트 측에 DHCP를 통해 새 IP가 할당되었거나 서버가 이미 해당 연결을 시간 초과 된 것으로 표시했기 때문에 발생합니다. 서버가 어떻게합니까? 클라이언트가 너무 길게 유휴 상태이면 연결이 안전하다고 가정합니다. 클라이언트 소프트웨어 일반적으로은 필요한 즉시 세션을 다시 설정하도록 설계되었습니다. 세션 흐름에 대한 더 엄격한 제한이 필요한 일부 응용 프로그램 수준 프로토콜은 일종의주기적인 "하트 비트"패킷 (유지 연결 패킷이라고도 함)을 사용합니다. ICMP 프로토콜 클라이언트 또는 서버 사용할 수 있습니다 같은 것들이 있지만 ICMP의 NAT 라우터 또는 일부 방화벽에 의해 차단 될 수 있습니다 포함하여 제한이 있습니다.

하트 비트 및 시간 초과가 부분 프로토콜 인 FTP의 고전적인 예가 있습니다. FTP. 이것은 두 개의 연결로 설계되었습니다. 하나는 "명령 채널"이고 하나는 데이터 전송 용입니다. 클라이언트 풀을 다 사용하지 않으려면 FTP 서버는 특정 시간에 명령이 보내지지 않으면 일반적으로 데이터 연결을 닫습니다. 클라이언트가 큰 파일을 "얻으려고"요청하면 어떻게됩니까? 전송이 완료되기 전에 서버가 전송을 끊을 수 있습니다. 그것은 "수동"FTP에 의해 해결 될 수 있습니다. FTP는 클라이언트 측 로그인에 대한 응답으로 데이터 연결을 만드는 서버 측 서버입니다. 클라이언트가 연결을받을 수 없으면 라우터 뒤에있을 수는 없습니다. 다른 해결책은 클라이언트가 "PWD"(현재 폴더 가져 오기)와 같이 많은 트래픽을 발생시키지 않는 "더미"명령을 주기적으로 보내는 것입니다.

하프 오픈 연결에 대한 주제가 많으므로 자신이 선호하는 디자인을 선택해야합니다.

+0

나는이 모든 것을 teoretically 알고 있습니까?나는 OSI 모델이 어떻게 작동 하는지를 안다. 나는 TCP가 어떻게 작동하는지 안다. 나는이 상황을 CODE하는 방법을 물었다. 반 개방 연결을 처리 할 무언가가 필요합니다. Winsock2를 사용하여 C++에서 이것을 어떻게 할 수 있습니까? 나는 이것을 구현하는 방법을 알 수 없다. 클라이언트가 연결을 끊을 때 서버 측에서 감지해야합니다. 소켓을 닫고 프로그램에서 나가기를 원합니다. – Serusar

+0

클라이언트와 서버간에 어떤 종류의 프로토콜을 사용할지 반기 확인이 필요하다면 초안을 작성해야합니다. Stone 워크 플로우 나 패턴에 대한 설정이 없습니다. 특히 일부 라이브러리 대신 순수 API를 사용하는 경우 특히 그렇습니다. net 주변에 예제가 있습니다. 연구해야합니다. – Swift

+0

@Serusar 프로토콜의 일부로 소켓 용 옵션은 거의 사용되지 않습니다. https://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs) .85) .aspx – Swift

관련 문제