udplistener.cpp
来自「这是整套横扫千军3D版游戏的源码」· C++ 代码 · 共 100 行
CPP
100 行
#include "UDPListener.h"
#include <boost/weak_ptr.hpp>
#include "ProtocolDef.h"
namespace netcode
{
UDPListener::UDPListener(int port)
{
boost::shared_ptr<UDPSocket> temp(new UDPSocket(port));
mySocket = temp;
acceptNewConnections = true;
}
UDPListener::~UDPListener()
{
}
void UDPListener::Update(std::queue< boost::shared_ptr<CConnection> >& waitingQueue)
{
for (std::list< boost::weak_ptr< UDPConnection> >::iterator i = conn.begin(); i != conn.end(); )
{
if (i->expired())
i = conn.erase(i);
else
++i;
}
do
{
unsigned char buffer[4096];
sockaddr_in fromAddr;
unsigned recieved = mySocket->RecvFrom(buffer, 4096, &fromAddr);
if (recieved < UDPConnection::hsize)
{
break;
}
RawPacket* data = new RawPacket(buffer, recieved);
bool interrupt = false;
for (std::list< boost::weak_ptr<UDPConnection> >::iterator i = conn.begin(); i != conn.end(); ++i)
{
boost::shared_ptr<UDPConnection> locked(*i);
if (locked->CheckAddress(fromAddr))
{
locked->ProcessRawPacket(data);
interrupt=true;
}
}
if (interrupt)
continue;
const int packetNumber = *(int*)(data->data);
const int lastInOrder = *(int*)(data->data+4);
if (acceptNewConnections && packetNumber == 0 && lastInOrder == -1)
{
// new client wants to connect
boost::shared_ptr<UDPConnection> incoming(new UDPConnection(mySocket, fromAddr));
waitingQueue.push(incoming);
conn.push_back(incoming);
incoming->ProcessRawPacket(data);
}
else
{
// throw it
delete data;
}
} while (true);
for (std::list< boost::weak_ptr< UDPConnection> >::iterator i = conn.begin(); i != conn.end(); ++i)
{
boost::shared_ptr<UDPConnection> temp = i->lock();
temp->Update();
}
}
boost::shared_ptr<UDPConnection> UDPListener::SpawnConnection(const std::string& address, const unsigned port)
{
boost::shared_ptr<UDPConnection> temp(new UDPConnection(mySocket, address, port));
conn.push_back(temp);
return temp;
}
void UDPListener::SetWaitingForConnections(const bool state)
{
acceptNewConnections = state;
}
bool UDPListener::GetWaitingForConnections() const
{
return acceptNewConnections;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?