socket close
글쓴이: 하하 / 작성시간: 목, 2004/11/25 - 10:53오전
내가 active close를 했을때..
즉 .. 먼저 close를 호출해서.. 연결된 상대한테 FIN을 보냈을때..
TCP 상태 천이도를.. 보면.. Active Close 상태에서
FIN을 보낸다음.. ack 던, FIN 이던 받아야 Active Close 가 완료(?)
되는 걸로 그려져 있습니다.
그런데 이때.. 연결된 상대가.. 랜선이 뽑혀서.. 내가 보낸 FIN 에 대한.
걸 받을수도.. 그것에 대한 응답을 할수 도 없는 상황이라 했을때..
상태 천이도에도.. 그것에 대한 방안은 없어 보임니다..
또한.. Active Close를 시도한 나의.. 연결 상태도.. 어떠한 응답도
못받은 상황이므로.. 연결상태 입니다......
이러한 상황일때.. 과연 저는. 어떻게 하면.. 소켓을 완전히 끊을수 있을까요?
소켓 옵션에 보면.. KEEPALIVE 가 있는데.. 이건.. 꾀 오랜 시간(3시간 정도)
흘러야 끊기는걸로 알고 있습니다.
또한 SO_LINGER 같은 경우.. 응용단에서.. close 함수가 리턴은 되겠지만..
실제.. 상대와는 연결 상태로 되있습니다...........
어떻게 생각하시나요?
TCP의 헛점일까요? 아님 제가 멀 크게 잘못생각하고 있는 걸까요?
Forums:
close가 block 되어서 안넘어오는 상황이 발생하는 것이죠?
close가 block 되어서 안넘어오는 상황이 발생하는 것이죠?
정확한 해결책이 될 수 있을지는 모르겠습니다만,
1. alarm으로 깨어나도록하는 방법
2. close하기 전에 nonblock으로 바꾸고 select를 통해 timeout 내에서만 기다리도록하는 방법
이렇게 해보시면 어떨까요? 1 번의 경우 thread program이라면 좀 쓰기 귀찮을 것이고, 2 번이라면, 단순한것에 너무 복잡하게 대응하는 것 같아서 그렇기는 하지만.. 우아하게 종료하려면.. 해봄직합니다.
---
http://coolengineer.com
아.... 아뇨..close 블럭은.. LINGER 옵션을 주면
아.... 아뇨..
close 블럭은.. LINGER 옵션을 주면 블럭 현상은
피할 수 있었습니다.
헌데.. close가 리턴되고서도
netstat -nac | grep port 를 하면..
여전히.. establish 이어서요...
상태가.. LAN 선 이 빠졌다거나 여튼 내가 close를
호출하여 FIN을 보낸 상황에 대해 전혀 응답을 못할때의
경우입니다
close가 리턴되었을 때, return 값은 어떤것이죠?그리고,
close가 리턴되었을 때, return 값은 어떤것이죠?
그리고, close가 성공적으로 return 되었다면, netstat 에서는 FIN_WAIT 으로 보여야 정상입니다.
계속 ESTABLISHED 상태라면 close를 통한 fin 패킷이 전송되지 않았기 때문입니다.
---
http://coolengineer.com
거참 이상합니다. close 호출씨.분명 리턴값은 -1 은 아닙니
거참 이상합니다. close 호출씨.
분명 리턴값은 -1 은 아닙니다.
또한..
netstat -nac | grep port
tcp 0 0 218.145.xx.xx:28001 203.236.xx.xx:61213 ESTABLISHED
계속 연결된 상태로 있습니다.
댓글 달기