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;
}
Beispiel #2
0
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;
}
Beispiel #4
0
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;
}