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
[15142] 우드블록 문제입니다.
김상구.패패루 [peperu] 1823 읽음    2002-01-30 17:48
어싱크 소켓을 블럭소켓 쓰듯이 쓰시니까 그런겁니다. ^^
비동기 소켓에서는 내가 100만큼의 데이터를 읽겠다고 해도 50만 날아올 수 있습니다. 아예 안날아오고 에러가 나기도 하죠. GetLastError 등으로 마지막 에러를 검사(우드블럭인지 일반 에러인지)하는 루틴이 꼭 필요하고.. 만약 우드블럭이라면, 그냥 빠져 나오면 됩니다. OnRead가 조만간 또 뜰테니까요. 실제 받은 데이터의 크기를 계속 검사하면서 원래 받기로 했던 만큼 다 날아왔는지 체크하고 아직 다 안왔다면 미리 받았던 데이터에 계속 이어붙여야 합니다. 그래서 비동기 소켓이 지X같다는거구요. ^^ 하지만.. 잘 쓰면 쓰레드 하나로 멀티소켓 어플을 구현할 수 있고 리소스를 적게 먹게 설계할 수 있으므로 성능면에서 유리하기도 합니다.

비동기 소켓은 양날의 검입니다. 이 점을 잊지 마세요.
그냥 간편하게 만들 생각이시라면 리소스같은거 신경 쓰지 마시고 동기식으로 구현하시기 바랍니다.

컴포넌트를 쓰신 것 같은데.. 제 경험으로는 소켓쪽은 API레벨에서 공부하신 후에 컴포넌트를 쓰시는게 좋습니다. 그래야 완벽하게 이해되죠.

꿈을꿨어 님이 쓰신 글 :
: TClientSocket붙여서 접속하고 데이터 보내면 서버에서 응답도 제대로옵니다.
:
: 그런데 서버에서 보낸만큼 다 읽었는데 OnRead이벤트가 계속해서 발생합니다.
:
: 결국 에러내고 서더군요. 왜이런지 도무지 알수가 없습니다. 왜그럴가요?
:
:
: void __fastcall TSDIAppForm::socktRead(TObject *Sender,
:       TCustomWinSocket *Socket)
: {
:     Memo4->Lines->Add("socktRead");//메모장에다 찍어봤더니 계속 socktRead가 더해지더군여 에러날때까지
:
:     int headerlength = pmc->mparser.getHeaderLength();
:
:     if (Socket->ReceiveBuf(headerbuf,headerlength) < headerlength){
:         ShowMessage("Network error occured closing connection");
:         close();
:         return;
:     }
:
: }
:
:

+ -

관련 글 리스트
15140 [질문]어싱크 소켓에서 OnRead이벤트가 데이터를 다 받고 나서도 계속 납니다.왜그렇지요 꿈을꿨어 1734 2002/01/30
15142     우드블록 문제입니다. 김상구.패패루 1823 2002/01/30
15148         답변 감사합니다. 꿈을꿨어 812 2002/01/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.