105 lines
1.9 KiB
C++
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;
|
|
} |