DragonNest/Common/NetworkLib/NetSocketRUDP.cpp

171 lines
3.8 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include <tchar.h>
#include <stdio.h>
#include "NetSocketRUDP.h"
#include "DNPacket.h"
#include "ClientSessionManager.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CNetSocketRUDP::CNetSocketRUDP()
{
memset(&m_DirectAddr, 0, sizeof(_ADDR));
memset(&m_DetectAddr, 0, sizeof(_ADDR));
m_hNetID = 0;
m_UDPIP = 0;
m_UDPPort = 0;
m_pReceiver = NULL;
m_bIdle = false;
}
CNetSocketRUDP::~CNetSocketRUDP()
{
if (m_hNetID != NULL)
DisConnect();
CRUDPSocketFrame::Close();
m_bIdle = false;
}
bool CNetSocketRUDP::Connect(const char * ip, int port)
{
m_bIdle = Connect(inet_addr(ip), port);
return m_bIdle;
}
bool CNetSocketRUDP::Connect(unsigned long ip, int port)
{
if (m_hNetID > 0)
return true;
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = ip;
memcpy(m_DirectAddr.ip, &ip, 4);
m_DirectAddr.port = port;
if (CRUDPSocketFrame::Open(0, 0, 0, true, false) == false)
return false;
m_hNetID = CRUDPSocketFrame::Connect(inet_ntoa(addr.sin_addr), port);
m_bIdle = true;
return true;
}
void CNetSocketRUDP::DisConnect()
{
if (m_hNetID != 0)
{
CRUDPSocketFrame::DisConnect(m_hNetID);
CNetSocketRUDP::Close();
}
}
void CNetSocketRUDP::DisConnected(int iNetID, bool bForce, bool bUnreachable)
{
if (m_hNetID != 0)
{
CNetSocketRUDP::Close();
m_hNetID = 0;
}
}
int CNetSocketRUDP::Send(int main_header, int sub_header, void * data, int size, int prior, BYTE cSeqLevel)
{
DNGAME_PACKET packet;
int len;
len = EncodeGamePacket(&packet, main_header, sub_header,data, size, cSeqLevel);
len = SendTo(&packet, len, prior);
return len;
}
void CNetSocketRUDP::Receive(void * data, int size, _ADDR * addr)
{
char * ptr;
int packetsize, i = 0;
DNGAME_PACKET * p;
if (size <= 0) return;
for (i = 0; i < size;)
{
ptr = (char*)data + i;
packetsize = CalcGamePacketSize((DNGAME_PACKET*)ptr, size - i);
if (i + packetsize > size) break;
p = (DNGAME_PACKET*)ptr;
if (DecodeGamePacket(p) == true)
{
#ifndef _SKIP_THREAD
if (m_pReceiver)
m_pReceiver->RecvData(p);
#else
if (m_pReceiver)
m_pReceiver->RUDPRecieve(p->header, p->sub_header, p->data, p->datasize, addr);
#endif
}
i += packetsize;
}
}
void CNetSocketRUDP::DetectAddr(const char * ip, int port)
{
if (port <= 0) return;
if (m_DetectAddr.port > 0) return ;
unsigned long iIP = _inet_addr(ip);
memcpy(m_DetectAddr.ip, &iIP, 4);
m_DetectAddr.port = port;
if (m_DetectAddr.port > 0)
{//NATProbe<62><65> <20><><EFBFBD>Ͽ<EFBFBD> UDP IP<49><50> Port<72><74> <20>˾<EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>.
for (int i = 0; m_UDPPort == 0 && i < 4000; i +=4000/10)
{
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = ntohs(m_DetectAddr.port);
addr.sin_addr.S_un.S_addr = _inet_addr(m_DetectAddr.ip);
CRUDPSocketFrame::SendTo("ping", 4, &addr);
Sleep(4000/10);
}
}
}
void CNetSocketRUDP::Recv(int id, void * data, int len)
{//RUDPSocketFrame<6D>ܿ<EFBFBD><DCBF><EFBFBD> recv<63><76> <20>߻<EFBFBD><DFBB>ߴ<EFBFBD>. <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
Receive(data, len, &m_DirectAddr);
}
int CNetSocketRUDP::SendTo(void * msg, int size, int prior)
{//<2F><><EFBFBD>۸<EFBFBD><DBB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>׳<EFBFBD> <20>ٷιٷ<CEB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~
return CRUDPSocketFrame::Send(m_hNetID, msg, size, prior);
}
bool CNetSocketRUDP::Accept(int id, SOCKADDR_IN * addr, const void * buf, int size)
{
if (m_DetectAddr.port != 0 && addr->sin_port == ntohs(m_DetectAddr.port) && addr->sin_addr.S_un.S_addr == _inet_addr(m_DetectAddr.ip))
{
struct _RETURN_UDP_ADDR
{
unsigned short port[2];
unsigned long addr[2];
} * packet = (_RETURN_UDP_ADDR*)buf;
_ASSERT(addr->sin_port == ntohs(m_DetectAddr.port) && addr->sin_addr.S_un.S_addr == _inet_addr(m_DetectAddr.ip));
if (size == sizeof(*packet) && packet->port[0] == packet->port[1] && packet->addr[0] == packet->addr[1] && m_UDPPort == 0)
{
m_UDPIP = packet->addr[0];
m_UDPPort = packet->port[0];
}
return true;
}
return false;
}