C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[26] C++Builder Socket 분석 (3) - Socket이 종료될 때
정남영 [kermi] 14145 읽음    2002-04-26 03:29

3. Socket이 종료될 때

작성자 : 정남영(kermi)
E-mail : kermi@borlandforum.com 

 

0. 강의에 들어가면서

 

1. Socket Class의 구조

 

2. Socket이 접속할 때

Þ

3. Socket이 종료될 때

 

4. Socket에 Data가 전달될 때

 

5. Socket에서 Error 처리

 

 저번 강좌에서는 소켓이 접속할 때에 관련된 내용을 알아보았다. 이번에는 접속이 종료될 때에 대해서 알아보도록 하겠다.

 성공적인 연결 후에 데이터를 Send/Receive작업을 하다가 프로그램을 끝낼 때는 항상 Socket을 종료시키는 절차를 따라주어야 한다. 프로그래머의 입장에서는 ‘Socket->Close();’라는 코드만 추가해 주면 되는 그다지 큰 노력이 드는 작업이 아니지만 그래도 알아서 나쁠 건 없으리라 생각한다. 또한 당연한 말이겠지만 자세한 내용은 MSDN을 참고하길 바란다.

 Socket의 종료는 Server에서든 Client에서든 혹은 양쪽 모두에서든 종료작업을 시작할수 있다. Client에서 접속을 종료한 경우를 예를 들어 보면 다음과 같다.

 

Client에서 Server에게 연결종료의 시작을 알리는 FIN을 보내게 되면 Server는 Client에게 FIN – ACK를 보내게 된다. 그리고 곧바로 Server에서 FIN신호를 Client에게 보내며 Client는 수신확인 메시지로 FIN – ACK 신호를 서버로 보내게 된다.(자세한 내용은 TCP/IP관련 서적을 참고하기 바란다. 여기 설명은 엄청 많은 내용이 빠져있다.)

위의 경우는 연결 종료의 한 예를 보여준다. 이밖에도 half-close의 경우에는 위의 그림과 다른 모양의 화살표가 그려지게 된다.

그럼 프로그래머의 관점에서 보도록 하자.

우선 Client 측면에서 설명을 하겠다. 접속을 종료하게 되면 FD_CLOSE 이벤트가 발생하게 된다. 그후 OnDisconnect 이벤트가 발생한다. 이벤트 발생 후 소켓은 closesocket으로 완전히 닫히게 된다.

그럼 이번엔 Server쪽을 설명하겠다. Server쪽은 설명에 그림이 필요할 것 같아 1회에서 보여주었던 그림을 다시 사용하도록 하겠다.

위의 그림은 ServerSocket에 Client가 접속할때의 모습을 그린것이다. 1회 설명을 읽었던 분들이라면 무엇을 뜻하는 그림인지 잘 알것이다. 위의 그림을 보게되면 Socket(2)에서 Data를 Send/Receive하는 작업이 발생하게 되면 Socket(2)가 가지고 있는 Window Handle에 메시지를 전달하게 된다. 즉, 어떠한 작업이 발생하게 되면 자기자신과 관계된 Socket Handle과 Window Handle 한쌍의 TserverClientWinSocket에서만 알게 된다는 것이다. 그럼 소켓의 종료를 알리는 FD_CLOSE가 발생할 경우엔 어떻게 될까? 여전히 TserverClientWinSocket밖에 모른다는 말이다. 그럼 문제가 하나 생긴다. 소켓이 Accept한 시점에서 Fconnections에 등록된 리스트에 자신의 종료를 알려야 된다는 것이다.

이를 위해 TserverClientWinSocket에서는 다른 순서를 취하게 된다. 우선 FD_CLOSE 메시지가 발생되면 자기 자신(TserverClientWinSocket)에게 CM_DEFERFREE 메시지를 PostMessage로 전송하게 된다. 메시지를 수신하게 되면 곧바로 Free를 호출해 destructor를 호출하게 되며 destructor안에서 closesocket등의 마무리 작업을 진행하게 된다. VC++의 예제에서도 이러한 방법이 사용된다. 동적으로 생성된 객체를 delete this;의 형태로 삭제하는 방법이 사용된다.

소켓의 종료는 생각보다 많은 것을 고려해야 되는 경우가 있다. 소켓의 종료와 관련되는 옵션을 바꾸었을 때는(예를 들어 LINGER같은 경우) 프로그램에 따라 적절한 부가적인 조치가 필요한 경우도 있다. 관련 자료를 참고해 보도록 하면 많은 도움이 될것이다. 의외로 이런 경우를 지나치면 서버의 안전성에 문제가 되는 경우도 있기 때문에 필요한 지식을 습득하는걸 적극 권장한다.

 

 


+ -

관련 글 리스트
26 C++Builder Socket 분석 (3) - Socket이 종료될 때 정남영 14145 2002/04/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.