ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CAsyncSocket 상속받아 사용하기
    기타 언어 2019. 9. 20. 18:41

    비동기형 소켓 사용을 위한,

    Server(Java, Linux) 연동을 위한,

    한글 전송을 위해 사용되어진 Class다

     

    http://xenostudy.tistory.com/298

     

    위 사이트를 참고하여 client를 간략하게 만들었으나, 제대로 동작하지 않았다.

     

    일단 위 사이트 참고하여 CAsyncSocket를 상속 받아

     

    virtual void OnSend(int nErrorCode);

    virtual void OnReceive(int nErrorCode);

    virtual void OnClose(int nErrorCode);

    virtual void OnConnect(int nErrorCode);

    virtual void OnAccept(int nErrorCode);

     

    위 다섯개를 오버라이드 하였다

     

    그러나 Create -> Connect를 호출하게 될 경우 OnConnect를 호출하게 되어 있는데 되지 않았다.

     

    함수 호출 순서[Client]

    OnConnect -> OnSend -> OnReceive -> OnClose

     

    추가 참고 사항 http://eunchul.com/database/board/cat.php?data=Win32_API&board_group=D4b9682d55adc9

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

    * OnConnect() : 클라이언트에서 Connect()함수를 호출한 경우 Conncet 시도에 대한 결과가 나왔을때 호출된다.
    이 함수를 오버라이딩 한 경우, Connect의 성공은 Connect()함수의 리턴값이 아니라 OnConnect()함수에 인자 에러값으로 확인한다. MSDN에는 Connect()가 성공하면 호출된다고 되어 있는데, 직접 경험한 바로는 실패했을때도 OnConnect() 함수가 호출된다.


    * OnAccept() : 클라이언트가 서버로 Connect()를 시도한 경우 서버에서 호출되는 함수이다. OnAccept()함수 안에서 Accept() 호출해서 클라이언트의 접속을 받아들이면 된다.


    * OnClose() : 서버나 클라이언트 모두 해당하는 함수로, 상대방이 Close()함수를 호출한 경우 호출되는 함수다. 상대방이 Close()를 호출했으므로 나도 여기서 Close()를 해주면 되겠다.


    * OnSend() : 서버나 클라이언트에서 Send()함수 호출시 WSAEWOULDBLOCK(우드블락) 에러가 발생한 이후 NIC의 Send버퍼에 여유공간이 생긴 경우, 클라이언트에서 Connect()가 성공한 경우( OnConnect()호출 이후 ), 서버에서는 OnAccept(), Accept() 호출 이후 호출되는 함수이다.


    * OnReceive() : 서버나 클라이언트에서 상대방이 Send()를 호출하여 전송한 데이터가 도착한 경우 호출되는 함수이다. 이곳에서 Receive()함수는 반드시 1번만 호출해야 한다. MSDN에 나와 있다.

     

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

    여러 인터넷을 참고 하면서 Connect함수를 호출하면 리턴으로 BOOL값을 받게되어 있으나 접속에 성공 or 실패든 모든 리턴값은 동일하다.(FALSE)

     

    그럼 궁금한게 하나 생기게 된다.

    결과 값은 어디서 확인하나 싶을것이다.

     

    OnConnect(int ErrorCode)

    여기서 ErrorCode를 이용하여 연결 성공여부를 할 수 있을것이다.

     

    하지만 위에서 말한것처럼 성공여부도 알 수 없었다.

    OnConnect함수가 호출이 되지 않아서 이다. 이것때문에 3일동안 제자리 걸음만 했을 뿐이다.

     

    알고 봤더니 소켓초기화를 시켜야 했었다.

     

    AfxSocketInit(NULL); 

     

    위 한줄때문에 계속 문제가 발생 했던 것이였으며, 참조 헤더파일만 include한다면 문제없이 해결 될것이다.

     

    참고 사이트 하나더

    http://gandus.tistory.com/460

     

    무튼 잘 해결되어서 기쁘다.. 이제 다음단계로 진행 ㄱㄱ!!

    '기타 언어' 카테고리의 다른 글

    [Linux] MakeFile만들기 - 기초편  (0) 2019.09.20

    댓글

Designed by Tistory.