2012-01-15 5 views
10

"정상적으로"TCP 소켓을 닫으려면 어떻게하는 것이 좋습니까?TCP 소켓을 올바르게 닫습니다.

호스트 버퍼의 나머지 모든 데이터를 read()하기 전에 close()를하면 원격 호스트에 문제가 발생할 수 있음을 알게되었습니다. 수신 버퍼의 모든 데이터가 손실 될 수 있지만 아직 그의 응용 프로그램에서 읽지 않은). 그 맞습니까?

그런 상황을 피하기위한 좋은 접근 방법은 무엇입니까? 버퍼링 된 데이터를 무시하고 소켓을 닫음으로써 데이터가 손실된다는 사실을 API에 알리는 방법이 있습니까?

아니면 응용 프로그램 프로토콜 수준에서 문제를 고려해야하고 암시 적 또는 명시 적 "전송 종료"신호를 사용하여 상대방에게 읽기 위해 소켓을 닫는 것이 안전하다는 것을 알리십시오.

+0

어떤 언어로 제공됩니까? – Kiril

+0

버클리 소켓; 나는 C를 사용하고 있지만, 일반적인 개념에 관심이 있습니다. – lxgr

답변

15

1) 더 이상 데이터를 소켓에 쓰지 않으려면 shutdown으로 전화하십시오.

2) 오류가 발생하거나 연결이 닫힐 때까지 소켓에서 read으로 계속 진행하십시오.

3) 이제 close 소켓.

이렇게하지 않으면 읽을 데이터가있는 동안 연결을 종료 할 수 있습니다. 이것은 비관적 인 결론을 낳을 것입니다.

+0

좋아, 할께. 호기심에서 벗어났습니다 : 내가 원격 호스트로 보낸 데이터가 내 수신 버퍼의 데이터를 무시하고 실제로 종료 될 수 있기 때문에 호스트가 보낸 데이터가 아니라면 실제로 손실 될 수 있습니까? – lxgr

+1

예, 원격 호스트에 전송 된 데이터는 상대방이 데이터를 읽기 전에 중단 된 종료가 발생할 수 있기 때문에 손실 될 수 있습니다. 연결이 종료되었다고 확신 할 때까지'close'를 호출하고 싶지는 않습니다. –

+3

1) 종료 (양말, 1), 2) 동안 (읽기 (양말, ...) = 0) 3) 닫기 (양말) 주문인가요? – ernesto

관련 문제