순간이 영원해 지는 곳

CAsyncSocket 콜백함수 호출 시기 본문

네트워크 프로그래밍

CAsyncSocket 콜백함수 호출 시기

nenunena 2009. 6. 8. 18:05

MFC CAsyncSocket Class

비동기 소켓 클래스 이다.

비동기라 함은 함수가 실패했을 경우에도 곧장 리턴이 되어 다음 줄의 코드가 실행된다는 뜻이다.
따라서 이 클래스에 있는 Send, Receive, SendTo, ReceiveFrom 함수는 모두 호출이후 곧장 리턴되는 논블로킹(non-blocking) 비동기 함수 이다.


동기(blocking)함수라면 해당 함수가 성공하거나 대기시간이 만료될때까지 리턴되지 않는다.


아래는 CAsyncSocket클래스 또는 이 클래스를 상속받은 클래스의 객체에서 TCP를 사용하는 경우에 적용되는 콜백함수의 호출 시기다.


* 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에 나와 있다.



우드블락 에러는 소켓에러중 정상적인 에러로써 NIC(Network Interface Card - 즉 LAN카드)의 Send버퍼가 꽉 찬경우에 발생하는 에러이다. 보통 NIC의 Send버퍼크기는 8Kbyte 정도라고 들었다.

Send()함수는 단순히 NIC의 Send버퍼에 데이터를 넣고 리턴하는 함수 이다. Send()함수가 리턴되어 다음줄로 넘어갔다고 해서 데이터가 네트워크를 이동중인 것이 아니다. 당신의 PC가 연결된 네트워크 트래픽이 엄청 많은 경우 NIC의 Send버퍼에 있는 데이터는 나가지 못하고 있을 수 있다.

그리고 Send()를 여러번 호출하는 경우 우드블락 에러가 발생하기 바로 전에 Send()함수의 리턴값(보낸 데이터크기)은 보내려는 데이터의 크기보다 작을 것이다. 그때 Send버퍼의 여유공간이 Send()하려는 크기보다 작았을 것이므로.



Comments