SO_LINGER 옵션에 관한 생각
글쓴이: 하하 / 작성시간: 수, 2003/12/17 - 3:35오후
so_linger 옵션은 close의 행동을 결정한다..
예를 들어
so_linger 를 off 했을 때
close 함수는 바로 return 된다.
이말은 소켓 송신 버퍼에 보낼 데이터가 있을지라도 close 함수가
TCP segment 옵션 RST 를 set 하고 return 한다는 의미
만약 보낼 데이터가 없다면 TCP segment 옵션 FIN을 set 하고
return 한다는 의미.
그럼 so_linger 를 on 하고
close 했을때 소켓 송신 버퍼에 보낼 데이터가 아직 남아 있다면
소켓은 블럭 또는 so_linger timeout 동안 블럭. 된다.
이게 so_linger에 제가 알고 있는 바입니다.
그렇데 한가지 의문이 드는게..
해당 소켓에 write를 한다면 write 함수가 return 되는 타임은
소켓 송신 버퍼의 내용이 다 비워질때 즉 서버로 부터 ack 올때
비로소 return 됩니다..
그렇담
so_linger 옵션은 논블럭 소켓에서만 유용하단 생각이 듭니다.
왜냐하면 블럭 소켓일 경우 write 함수 자체가 return 되지 않기
때문에 즉 소켓 송신 버퍼가 비워진 후에야 close 함수가 호출되기
때문에 close 가 so_linger를 set 하던 안하던 상관이 없단 생각이
듭니다.
Forums:
음...
확인응답이 와야 write함수가 리턴되는것이 아니라 소켓버퍼에 일단
쓰면 리턴되는거 아닌가요?
님의 말씀이 틀린것은 아니나(ack가 와야 window 싸이즈가 조정되며
소켓 버퍼가 비워지고 데이터가 가겠지만...) 꼭 ack가 와야 리턴되는것은 아니지요.
SO_LINGER 옵션에 대한 내용은 검색하면 많이 나옵니다.
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
위에 분도 언급하셨듯이 write 함수는 패킷을 보내어 ACK 를 받을때
위에 분도 언급하셨듯이 write 함수는 패킷을 보내어 ACK 를 받을때 리턴되는것이 아니라 OS 차원의 소켓 처리영역으로 들어가면 리턴하게 되는것입니다.
그리고 write 를 계속 콜한다해도 실제적으로 소켓은 그때마다 데이타를 보내는것이 아니마라 여러데이타를 한번에 합쳐서 보내기도 하고 또 ACK 를 안 받고도 다음 패킷을 계속 보내고 ACK 는 나중에 한꺼번에 받기도 합니다.
즉, wirte 함수가 성공한 시점이 상대편에서 read 가 성공한 시점은 아니라는거죠.
따라서 논블럭이고 블럭이고 그건 어떻게 보면 프로그램적인 처리방식의 문제이지 차이는 없습니다.
댓글 달기