bool ClientSession::PostRecv() { if ( !IsConnected() ) { return false; } DWORD recvbytes = 0; DWORD flags = 0; WSABUF buf; buf.len = (ULONG)m_RecvBuffer.GetFreeSpaceSize(); buf.buf = (char*)m_RecvBuffer.GetBuffer(); memset( &m_OverlappedRecv, 0, sizeof( OverlappedIO ) ); // 비동기 입력 호출이 완료 되었을 때 콜백 함수가 실행 되면 // 어느 호출이 부른 것인지를 식별하기 위해 // ClientSession* 를 담고 있는 멤버변수 mObject에 this (현재 객체) 주소 대입 m_OverlappedRecv.m_Object = this; /// 비동기 입출력 시작 if ( SOCKET_ERROR == WSARecv( m_Socket, &buf, 1, &recvbytes, &flags, &m_OverlappedRecv, RecvCompletion ) ) { if ( WSAGetLastError() != WSA_IO_PENDING ) { return false; } } // Overlapped IO 요청 했음. 카운트 증가 IncOverlappedRequest(); return true; }
bool ClientSession::PostRecv() { if ( !IsConnected() ) return false; DWORD recvbytes = 0; DWORD flags = 0; WSABUF buf; buf.len = (ULONG)mRecvBuffer.GetFreeSpaceSize(); buf.buf = (char*)mRecvBuffer.GetBuffer(); memset( &mOverlappedRecv, 0, sizeof(OverlappedIO) ); mOverlappedRecv.mObject = this; /// 비동기 입출력 시작 if ( SOCKET_ERROR == WSARecv(mSocket, &buf, 1, &recvbytes, &flags, &mOverlappedRecv, RecvCompletion) ) { if ( WSAGetLastError() != WSA_IO_PENDING ) return false; } IncOverlappedRequest(); return true; }
bool ClientSession::SendFlush() { if (!IsConnected()) return false; /// 보낼 데이터가 없으면 그냥 리턴 if (mSendBuffer.GetContiguiousBytes() == 0) return true; DWORD sendbytes = 0; DWORD flags = 0; WSABUF buf; buf.len = (ULONG)mSendBuffer.GetContiguiousBytes(); buf.buf = (char*)mSendBuffer.GetBufferStart(); memset(&mOverlappedSend, 0, sizeof(OverlappedIO)); mOverlappedSend.mObject = this; // 비동기 입출력 시작 if (SOCKET_ERROR == WSASend(mSocket, &buf, 1, &sendbytes, flags, &mOverlappedSend, SendCompletion)) { if (WSAGetLastError() != WSA_IO_PENDING) return false; } IncOverlappedRequest(); //assert(buf.len == sendbytes); return true; }
bool ClientSession::Send(PacketHeader* pkt) { if ( !IsConnected() ) return false; /// 버퍼 용량 부족인 경우는 끊어버림 if ( false == mSendBuffer.Write((char*)pkt, pkt->mSize) ) { Disconnect(); return false; } /// 보낼 데이터가 있는지 검사 if ( mSendBuffer.GetContiguiousBytes() == 0 ) { /// 방금전에 write 했는데, 데이터가 없다면 뭔가 잘못된 것 assert(false); Disconnect(); return false; } DWORD sendbytes = 0; DWORD flags = 0; WSABUF buf; buf.len = (ULONG)mSendBuffer.GetContiguiousBytes(); buf.buf = (char*)mSendBuffer.GetBufferStart(); memset( &mOverlappedSend, 0, sizeof(OverlappedIO) ); mOverlappedSend.mObject = this; // 비동기 입출력 시작 if ( SOCKET_ERROR == WSASend(mSocket, &buf, 1, &sendbytes, flags, &mOverlappedSend, SendCompletion) ) { if ( WSAGetLastError() != WSA_IO_PENDING ) return false; } IncOverlappedRequest(); return true; }