DragonNest/Common/NetworkLib/ClientUdpSocket.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

279 lines
No EOL
5.2 KiB
C++

#include "StdAfx.h"
#include "ClientUdpSocket.h"
#include "ClientSessionManager.h"
//##
/*
CClientUdpSocket::CClientUdpSocket(void): CClientSession()
, m_hThread(0)
{
m_bServer = m_bRecvThreadClose = false;
}
CClientUdpSocket::CClientUdpSocket(int nSize): CClientSession(nSize)
, m_hThread(0)
{
m_bServer = m_bRecvThreadClose = false;
}
CClientUdpSocket::~CClientUdpSocket(void)
{
Clear();
}
bool CClientUdpSocket::Init(const USHORT nPort, bool bServer)
{
if (nPort <= 0) return false;
Clear();
m_Socket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_Socket == INVALID_SOCKET) return false;
sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
sa.sin_port = htons(nPort);
if (bind(m_Socket, (sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR){
int nError = WSAGetLastError();
closesocket(m_Socket);
return false;
}
m_bServer = bServer;
UINT nThreadID;
m_hThread = (HANDLE)_beginthreadex(NULL, 0, RecvThread, this, 0, &nThreadID);
if( m_hThread == INVALID_HANDLE_VALUE ) return false;
GetExitCodeThread( m_hThread, &m_dwThreadExitCode );
return true;
}
void CClientUdpSocket::Clear()
{
DestroyRecvThread();
if (m_Socket != INVALID_SOCKET){
OnDisconnect();
closesocket(m_Socket);
}
m_Socket = INVALID_SOCKET;
m_bRecvThreadClose = false;
}
void CClientUdpSocket::DoRecv()
{
static char buffer[32768];
USHORT nRecv;
TUdpData *pUdpData;
while (m_pRecvBuffer->GetCount () > sizeof(USHORT)) {
if (m_pRecvBuffer->View((char *)&nRecv, sizeof(USHORT)) < 0) break;
if (m_pRecvBuffer->GetCount () < nRecv) break;
if (m_pRecvBuffer->Pop(buffer, nRecv) < 0) break;
pUdpData = (TUdpData*)buffer;
RecvMessageProcess(pUdpData->Data, ( pUdpData->Len - sizeof(USHORT) - sizeof(sockaddr_in) ), &pUdpData->Addr);
}
}
void CClientUdpSocket::DestroyRecvThread()
{
if( m_hThread ) TerminateThread( m_hThread, m_dwThreadExitCode );
m_hThread = 0;
}
int CClientUdpSocket::Disconnect(int nConnectionID)
{
return 1;
}
void CClientUdpSocket::Send(BYTE cMode, char *pData, int nSize, SOCKADDR_IN *pAddr)
{
switch(cMode)
{
case UDPMODE_SEND_FAST:
SendData(pData, nSize, pAddr);
break;
case UDPMODE_SEND_RELIABLE:
SendReplyMsg(UDPMODE_SEND_RELIABLE, pAddr);
SendData(pData, nSize, pAddr);
break;
case UDPMODE_SEND_SEQUENTIAL:
break;
default:
break;
}
}
void CClientUdpSocket::Flush()
{
}
void CClientUdpSocket::SendData(char *pData, int nSize, SOCKADDR_IN *pAddr)
{
sendto(m_Socket, pData, nSize, 0, (sockaddr*)pAddr, sizeof(SOCKADDR_IN));
}
int CClientUdpSocket::DoUpdate()
{
DoRecv();
return 1;
}
void CClientUdpSocket::MessageProcess(char *pData, int nSize)
{
if( CClientSessionManager::GetInstance().IsActive() )
CClientSessionManager::GetInstance().OnDispatchMessageUdp( pData, nSize );
}
void CClientUdpSocket::RecvMessageProcess(char *pData, int nSize, SOCKADDR_IN *pAddr)
{
TUdpHeader *pHeader = (TUdpHeader*)pData;
switch(pHeader->Mode)
{
case UDPMODE_PING:
break;
case UDPMODE_PONG:
break;
case UDPMODE_DISCONNECT:
break;
case UDPMODE_SEND_FAST:
MessageProcess(pData, nSize);
break;
case UDPMODE_SEND_RELIABLE:
{
SendReplyMsg(UDPMODE_ACK_RELIABLE, pAddr);
MessageProcess(pData, nSize);
}
break;
case UDPMODE_SEND_SEQUENTIAL:
break;
case UDPMODE_SEND_STATE:
break;
case UDPMODE_ACK_RELIABLE:
break;
case UDPMODE_ACK_SEQUENTIAL:
break;
case UDPMODE_ACK_STATE:
break;
}
}
void CClientUdpSocket::SendReplyMsg(BYTE cMode, SOCKADDR_IN *pAddr)
{
TUdpHeader Header;
memset(&Header, 0, sizeof(TUdpHeader));
Header.Len = sizeof(TUdpHeader);
Header.Mode = UDPMODE_ACK_RELIABLE;
SendData((char*)&Header, Header.Len, pAddr);
}
void CClientUdpSocket::OnConnect()
{
}
void CClientUdpSocket::OnDisconnect()
{
CClientSession::OnDisconnect();
if( CClientSessionManager::GetInstance().IsActive() )
CClientSessionManager::GetInstance().OnDisconnectUdp();
}
void CClientUdpSocket::OnRecv()
{
char tmpBuf[CLIENTPACKETMAX];
memset(tmpBuf, 0, sizeof(tmpBuf));
SOCKADDR_IN Addr;
int AddrLen = sizeof(Addr);
int RecvSize = 0;
RecvSize = recvfrom(m_Socket, (char*)tmpBuf, sizeof(tmpBuf), 0, (sockaddr*)&Addr, (int*)&AddrLen);
if (RecvSize > 0){
TUdpData UdpData;
memset(&UdpData, 0, sizeof(TUdpData));
UdpData.Len = (USHORT)(sizeof(USHORT) + sizeof(sockaddr_in) + RecvSize);
UdpData.Addr = Addr;
memcpy(UdpData.Data, tmpBuf, RecvSize);
m_pRecvBuffer->Push((char*)&UdpData, UdpData.Len);
}
}
void CClientUdpSocket::OnSend()
{
}
void CClientUdpSocket::OnError(int nError)
{
}
UINT __stdcall CClientUdpSocket::RecvThread(void *pParam)
{
CClientUdpSocket *pUdp = (CClientUdpSocket*)pParam;
while (1){
pUdp->OnRecv();
}
return 1;
}
*/
//---------------------------------------------------------------
CClientRUdpSocket::CClientRUdpSocket()
{
}
CClientRUdpSocket::~CClientRUdpSocket()
{
}
void CClientRUdpSocket::OnConnect(int nHandle, SOCKADDR_IN Addr)
{
}
void CClientRUdpSocket::OnDisconnect(int nHandle, SOCKADDR_IN Addr)
{
}
void CClientRUdpSocket::OnReceive(int nHandle, SOCKADDR_IN Addr, const void* ptr, unsigned short nLen)
{
if ( UseThread() == false )
{
if( CClientSessionManager::GetInstance().IsActive() )
CClientSessionManager::GetInstance().OnDispatchMessageUdp( (char*)ptr, nLen );
}
}