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
[24730] Re:ClinentSocket 에러(eeSend)처리 방법 질문입니다.(자답)
최해술 [] 2953 읽음    2003-03-14 15:16
최해술 님이 쓰신 글 :
: 클라이언트 소켓에서 에러가 났을경우
: 보통
:
: ClientSocketError 이벤트에서
: ErrorCode = 0로 처리를 합니다.
:
: 이경우 ErrorEvent가 eeConnect일경우 재 접속시 접속이 잘됩니다.
:
: 저의 경우 가끔 ErrorEvent가 eeSend로 날경우
: 소켓이 Close() 되지 않고 재 접속할 수 없는 상태가 됩니다.
:
: 여러가지 방법으로 소켓을 끊으려고 하는데 끊는 명령을 내려도
: 계속적으로 Active가 true로 표시됩니다.
:
: 현재 연결된 소켓을 끊고 재 접속 하고 싶은데 어떻게 하면 되는지 아시는
: 분 계시면 답좀 해 주세요
:
:

클라이언트 소켓 에러시 ErrorEvent의 값이 eeSend로 날 경우에 소켓이 Close()가 안되었습니다.
에러코드를 보니 두가지가 나타났습니다.
하나는 "10057 = Socket is not connected."일경우이고 다른 하나는
"10038 The descriptor is not a socket "이였습니다.

에러가 날때 10057로 나게되면 소켓이 Close()도 잘되고 재 접속하면 서버와 연결도 잘됩니다.

그러나 10038로 나게 되면 소켓이 Close가 안되고 클라이언트 소켓의 Active 값이 계속적으로
true인 상태로 남게 되어서 도저히 서버와 연결이 되지 않습니다.
이러한 원인이 무었일까 여러값들을 살펴보니 소켓의 SocketHandle값이 -1이더군요
즉 INVALID_SOCKET값을 가지는 경우였습니다. 왜 이러한 경우가 발생하는지 저로서는 알수가 없어서
저의 잛은 지식으로 소켓을 사려보려 여러가지를 시도했지만 잘 안되더군요.

그래서 다음과 같은 방법으로 소켓통신을 하도록 수정했습니다.
아마도 이방법보다 더 좋은 방법이 있을수 있겠으나 여기 Q&A에는 그러한 내용이 없어서 몇자 적습니다.
방법은 간단합니다.
소켓을 동적으로 할당해서 사용하다가 데이터를 전송할때 SocketHandle값이 값을 갖는지 판단합니다.
만인 SocketHandle값이 INVALID_SOCKET이면 할당된 소켓을 delete하고 다시 메모리 할당해서
소켓을 Open()하는 방법입니다.

혹 다른 방법이 있으면 알려주시기 바랍니다.









여러가지 방법으로 이러한 상태를 극복하고자 했지만 잘 안되는군요
에러코드가 10038일때만 소켓이 종료되지 않는 현상이라는 것을 알게되었습니다.

클라이언트 소켓 에러시

전형적인.. c/s 프로그램 입니다.
서버와 connection 잘 해서 서버에서 패킷을 잘 보냈다고 나오는데.
client의 TClientSocket 의 OnRead  event가 발생하기 전에..
10038 번 의 socket error가 발생합니다. 
winerror.h에 정의되어 있는 10038 오류에 대한 설명은 

//  An operation was attempted on something that is not a socket.
//
#define WSAENOTSOCK                      10038L

이렇더군요. 

가끔 이런 오류가 나는데 .. 이유가 무엇인지 아시는 분의. 조언 부탁드립니다

+ -

관련 글 리스트
24718 ClinentSocket 에러(eeSend)처리 방법 질문입니다. 최해술 1021 2003/03/13
24730     Re:ClinentSocket 에러(eeSend)처리 방법 질문입니다.(자답) 최해술 2953 2003/03/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.