2013-05-30 1 views
1

TCP 클라이언트가 TCP 서버와의 TCP 연결을 설정하는 경우. 그런 다음 TCP 클라이언트는 서버에 패킷을 보내지 않습니다.어떻게 리눅스 C에서 비활성 TCP 연결을 유지하려면?

먼저, 대략 TCP 서버 근처의 방화벽이 RST를 보낼 수 있음을 알고 있습니다. TCP 연결이 강제 종료되는 연결 유지 제한 시간이 있습니다. 그러나 나는 어떤 일이 일어날 지 정확히 알지 못합니다. 누구든지 조금 설명 할 수 있습니까?

둘째, 끝내기 전까지이 TCP 연결을 유지할 수 있습니까?

저는 TCP 서버가 TCP 스택에이 TCP 연결을 유지할 수 있기를 바랍니다. 하지만 TCP 클라이언트가 관련되기를 원하지 않습니다. 클라이언트가 KEEP-ALIVE 메시지를 보내지 않게하고 싶습니다. 다른 제 3 자 엔티티가 관여되기를 원하지 않습니다. 나는 TCP 클라이언트가 연결을 잃었는지 아닌지 상관하지 않는다. TCP 서버의 소스 코드를 작성할 때 소스 코드가 서버의 TCP 연결을 유지 관리 할 수 ​​있기를 바랍니다.

참고 : 제 프로그래밍 언어는 LINUX C

입니다.

+1

그것은 TCP의 이상한 사용법입니다. 왜 서버에 연결을 원하겠습니까? 클라이언트의 연결이 끊어져도 상관 없습니까? 또는 나는 무엇인가 놓치고 있냐? –

+0

예, 이상합니다. 나는 연구 작업을하고 있으며 TCP를 분리하려고합니다. – misteryes

+0

그러면 클라이언트가 끊어 지더라도 서버가 TCP 연결을 유지하기를 원하십니까? 가위를 잡고 케이블을 자르십시오. 그렇지 않으면 죽어가는 클라이언트의'FIN' 또는 중간 장치의'RST'가 흐름이없는 시간 초과로 인해 연구를 죽일 것입니다. –

답변

0

끝에서 킵 얼라이브를 사용하면 주기적으로 프로브를 보내고 응답이 없으면 연결이 재설정됩니다. Keepalive는 기본적으로 해제되어 있으므로 끝에서 활성화하지 않으면 끝나지 않을 것입니다.

그러나 피어는 자신의 끝에서 계속 활성화 할 수 있습니다.이 경우 자신의 종말이 위와 같이 작동하며 피할 수도없고 감지 할 수도 없습니다.

나머지 질문은 의미가 없습니다. 클라이언트 또는 방화벽은 여러 가지 이유로 언제든지 RST를 보낼 수 있습니다. 이를 막을 수는 없으며 코드에서이를 무시할 수 없습니다. 어떤 이유로 든 연결 재설정이 있으면 유지 보수 할 연결이 없습니다.

TCP를 원하지 않으면 다른 것을 사용하십시오.

+0

tcp 서버에서 keepalive를 활성화하지 않으면 어떻게됩니까? – misteryes

+0

keepalive를 활성화하면 Keepalive 프로브에 시퀀스 번호가 포함되고 시퀀스 번호가 확인됩니까? – misteryes

+0

서버에서 Keepalive를 활성화하지 않으면 프로브를 전송하지 않으므로 응답이 예상되지 않으므로 부재시 연결을 재설정하지 않습니다. 그건 내 대답에 이미 명시된 논리적 인 결과입니다. Keepalive 프로브는 이미 수신 된 시퀀스 번호에 대한 ACK로 구성됩니다. – EJP

관련 문제