ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MFC]CAsyncSocket 클래스 Connect() 반환값 버그(?)
    💻 프로그래밍/C, C++ 2018. 8. 30. 17:18

    안녕하세요! 코딩하는 Jay입니다. 정말 몇개월만에 블로그에 글을 쓰네요 ㅠㅠ


    그동안 운동에만 전념하고, 다른것에 대한 열정이 좀 식었어서..(망할 회사놈들) 하지만, 이제 다시 열정이 생겼네요!


    뭔가 막히고 잘 안될때는 다른곳으로 잠깐 눈을 돌렸다가, 돌아오면 다시 힘이 생기는 것 같아요:D


    저는 영어스터디를 하면서 많은 도움이 됬네요ㅋㅋㅋ


    네 잡담은 그만하고 오늘은 CAsyncSocket에 Connect() 에 대해서 간단히 알아보도록 하겠습니다.


    1. MSDN에서 확인한 CAsyncSocket과 CSocket 클래스의 상속관계


    CAsyncSocket 클래스가 CSocket의 부모클래스군요! ㅎㅎ 


    오늘제가 말씀드릴 내용은 CAsyncSocket 클래스를 상속받아서 socket을 만들고 Connect했을때 반환되는 값에서 생기는 버그(?) 입니다.


    저같은 경우 처음 MFC 소켓통신 API를 사용할때, 책의 예제를 통해서 배웠는데요.


    책에서는 CSocket 클래스를 상속받아서 사용했습니다. 


    CAsyncSocket 과 CSocket의 차이점은 동기/비동기 방식이라는 점입니다. 또한 CSocket이 좀더 안정적인 점(?)입니다. 


    아래 URL을 참고하시면 될 것 같습니다.


    * 참고 사이트 : http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=21164



    2. Connect 함수의 반환값

    Connect()는 소켓에 연결을 요청하는 함수입니다. MSDN 에서 보면 함수가 성공적으로 실행되면 0을 반환한다고 나와있습니다.


    자 그럼 실제로 그런지 실행해 보겠습니다.


    - CSocket 클래스 상속


    - CSocket Connect() 실행

    보시다시피 아주 잘 실행됩니다ㅎㅎ 아! 물론 서버 프로그램일 실행되고 있는 상태에서 클라이언트 접속요청하는 상황입니다.


    자세한 내용은 아래 글을 참고하시면됩니다.


    * TCP/IP 소켓프로그래밍 : http://jay-ji.tistory.com/26?category=732907


    다음은 동일한 코드에서 AsyncSocket을 상속받아서 진행해보도록 하겠습니다.


    - CAsyncSocket 클래스 상속


    CAsyncSocket Connect() 실행


    카카오 프렌즈 이모티콘에 대한 이미지 검색결과

                    (???? 뭐죠 ????)


    분명히 서버가 실행중이고 상속받는 클래스만 바꿨는데, 서버 커넥션이 실패했다고 합니다.


    그럼 실제로 실패한지 반환값과 서버에 연결되는 부분을 확인해보도록 하겠습니다.


    - 소켓 서버가 닫혀있을 경우(커넥션 에러가 정상)


    - 소켓 서버가 열려을 경우(커넥션 에러가 뜨면 안됨)

    보시다시피 서버가 활성화 되었고, 실제 서버쪽 다이얼로그에 클라이언트가 연결되었다고 표시까지 해주었습니다. 하지만 Connect()의 리턴값을 보면 


    항상 0(FALSE)을 반환합니다... 


    그럼 어떻게 소켓 연결이 실패했는지 확인할 수 있을까요? 바로 OnConnect()를 통해 확인 할 수 있습니다.


    OnConnect() 는 클라이언트에서 Connect()를 호출한 경우 Connect 시도에 대한 결과가 나왔을때 호출됩니다.


    한번 확인해 보겠습니다.



    OnConnect()를 오버라이딩 해서 에러코드를 출력해본 결과 소켓서버가 실행되고 있을때 0이 반환되었습니다.


    MSDN에서 확인해보니 0일경우 정상입니다. 그렇다면 소켓서버가 실행되고 있지 않을때는 어떨까요?



    오! 뭔가 이상한 값이 반환되었네요 ㅋㅋㅋ 딱봐도 에러같죠?!

    "연결이 거부되었다"라는 에러네요 ㅋㅋ 서버가 열리지 않아서 그런가 봅니다.


    3. 정리


    위 내용을 정리하면, 


    1. CSocket 클래스를 상속받아서 Connect()를 실행할때 성공하면 Nonzero, 실패 했을경우 0을 반환.


    2. 하지만 CAsyncSocket 클래스의 경우 성공, 실패 둘다 0을 반환한다. CsyncSocket 클래스를 상속받아서 사용할 경우, Connect()의 리턴값으로 Connection을 확인하는게 아니라 OnConnect()의 에러코드를 체크하여 확인.



    오늘의 포스팅은 여기까지 입니다. 사실 별거 아닐수도 있는데, 저같은 경우 왜 제대로 실행되어야 하는데 안돼는지 이해가 안되서 삽질을 했었네요ㅠ


    오늘도 재밌는 코드 생산하세요~:D


    카카오 프렌즈 이모티콘에 대한 이미지 검색결과

    (아디오스~:D)

    댓글

운동하는 개발자 JAY-JI