client/EterLib/NetDatagramReceiver.cpp

105 lines
1.9 KiB
C++

#include "StdAfx.h"
#include "NetDatagramReceiver.h"
BOOL CNetDatagramReceiver::Process()
{
m_recvBufCurrentPos = 0;
m_recvBufCurrentSize = 0;
int irecvAddrLength = sizeof(SOCKADDR_IN);
m_recvBufCurrentSize = recvfrom(m_Socket, (char *)m_recvBuf, m_recvBufSize, 0, (PSOCKADDR)&m_SockAddr, &irecvAddrLength);
if (m_recvBufCurrentSize <= 0)
{
return FALSE;
}
return TRUE;
}
BOOL CNetDatagramReceiver::Recv(void * pBuffer, int iSize)
{
if (!Peek(pBuffer, iSize))
return FALSE;
m_recvBufCurrentPos += iSize;
return TRUE;
}
BOOL CNetDatagramReceiver::Peek(void * pBuffer, int iSize)
{
if (m_recvBufCurrentSize < m_recvBufCurrentPos+iSize)
return FALSE;
memcpy(pBuffer, m_recvBuf + m_recvBufCurrentPos, iSize);
return TRUE;
}
BOOL CNetDatagramReceiver::isBind()
{
return m_isBind;
}
BOOL CNetDatagramReceiver::Bind(DWORD /*dwAddress*/, WORD wPortIndex)
{
m_Socket = socket(AF_INET, SOCK_DGRAM, 0);
DWORD arg = 1;
ioctlsocket(m_Socket, FIONBIO, &arg); // Non-blocking mode
memset(&m_SockAddr, 0, sizeof(SOCKADDR_IN));
m_SockAddr.sin_family = AF_INET;
// m_SockAddr.sin_addr.s_addr = dwAddress;
m_SockAddr.sin_addr.s_addr = INADDR_ANY;
m_SockAddr.sin_port = htons(wPortIndex);
if (bind(m_Socket, (PSOCKADDR)&m_SockAddr, sizeof(SOCKADDR_IN)) < 0)
{
Tracef("Failed binding socket\n");
return FALSE;
}
m_isBind = TRUE;
return TRUE;
}
void CNetDatagramReceiver::SetRecvBufferSize(int recvBufSize)
{
if (m_recvBuf)
{
if (m_recvBufSize>recvBufSize)
return;
delete [] m_recvBuf;
}
m_recvBufSize=recvBufSize;
m_recvBuf=new char[m_recvBufSize];
}
void CNetDatagramReceiver::Clear()
{
m_isBind = FALSE;
m_dwPortIndex = 1000;
m_Socket = 0;
memset(&m_SockAddr, 0, sizeof(SOCKADDR_IN));
m_recvBufCurrentPos = 0;
m_recvBufCurrentSize = 0;
}
CNetDatagramReceiver::CNetDatagramReceiver()
{
m_recvBuf = NULL;
m_recvBufSize = 0;
Clear();
}
CNetDatagramReceiver::~CNetDatagramReceiver()
{
if (m_recvBuf)
delete [] m_recvBuf;
}