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

C++빌더 Q&A
C++Builder Programming Q&A
[35549] Re:Non-block socket이 아직 동작중일때, 강제로 수행은 중지시키는 방법은?
박지훈.임프 [cbuilder] 1451 읽음    2004-06-11 02:30
넌블로킹 소켓은 쓰레드 안에서 사용하도록 만들어진 것이 아닙니다. 넌블로킹 소켓은 쓰레드를 쓰지 않으려고
할 때 사용하기 위한 것입니다. 따라서 VCL의 소켓 컴포넌트 내부적으로 그에 대한 대비가 안되어있을 수
있습니다.

구체적인 코드를 어떻게 쓰셨는지 모르기 때문에(소켓을 어디서 클로즈시켰는지 등) 구체적으로 어디서
문제가 생겼는지 확실히 답변할 수는 없겠습니다만...

쓰레드에서 넌블로킹 소켓을 썼을 때 문제가 될 수 있는 예를 들면, 쓰레드를 Terminate()할 때 소켓을 닫는
동작을 하는 타이밍을 잃어버릴 수 있을 것입니다. 넌블로킹 소켓은 내부적인 윈도우 핸들을 통해서 메시지를
받아 처리하는 구조이기 때문에 Terminate를 호출하는 시점에 소켓의 클로즈 등 마무리 처리가 안될 가능성이
충분히 있습니다.

그럼...


김영민 님이 쓰신 글 :
: Program에서 Thread를 10개정도 만들었습니다.
: 각 Thread 안에는 Socket을 Non-blocking으로 동작하게 햇습니다.
: 연결이 안되면(Active==false) 30초정도 이후에 다시 Open합니다.
: 그 결과치는 Main program으로 보내게 합니다.
:
: 여기서 한가지 문제가 있어서 질문드립니다.
: 처음 Thread를 10개만들면 각 Thread에서 통신을 연결할려고하고, 연결/비연결의 정보를 얻을 수 있습니다.
: 그런데, 이 상황에서 Threads를 전부 Terminate() 시켰습니다.
: 그리고 다시 만들었습니다. 여기까진 문제가 없는듯 한데요..
: 결론인즉, Program을 닫을려고 하거나, 혹은 진행중에 NULL에 접근한다는 Error가 나오는 군요.
: Debug에서 봐도 해당 Thread는 죽었는데..
: 혹시, Socket이 남아있어서 그런가요? 무슨 Buffer 같은곳에 뭔가가 아직 존재하는건가요?
: 어떻게 하면 Thread 죽일때, 안에서 생성한 Socket도 안전하게 종료하고 다시 Thread를 띄울 수 있을까요?
: 그럼.
:
: 수정>
: pthread->Suspend();
: pthread->Terminate();
: pthread->Resume();
: 식으로 연속으로 호출하니까.. 안전하게 죽는군요.. 왜그런지는 몰라도..*^^*
:

+ -

관련 글 리스트
35520 Non-block socket이 아직 동작중일때, 강제로 수행은 중지시키는 방법은? 김영민 934 2004/06/10
35549     Re:Non-block socket이 아직 동작중일때, 강제로 수행은 중지시키는 방법은? 박지훈.임프 1451 2004/06/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.