📄 netconnection.cc
字号:
return true;
}
void NetConnection::stopRecording()
{
if(mDemoWriteStream)
{
delete mDemoWriteStream;
mDemoWriteStream = NULL;
}
}
void NetConnection::recordBlock(U32 type, U32 size, void *data)
{
AssertFatal(type < MaxNumBlockTypes, "NetConnection::recordBlock: invalid type");
AssertFatal(size < MaxBlockSize, "NetConnection::recordBlock: invalid size");
if((type >= MaxNumBlockTypes) || (size >= MaxBlockSize))
return;
if(mDemoWriteStream)
{
// store type/size in U16: [type:4][size:12]
U16 typeSize = (type << 12) | size;
mDemoWriteStream->write(typeSize);
if(size)
mDemoWriteStream->write(size, data);
}
}
void NetConnection::handleRecordedBlock(U32 type, U32 size, void *data)
{
switch(type)
{
case BlockTypePacket: {
BitStream bs(data, size);
processRawPacket(&bs);
break;
}
case BlockTypeSendPacket:
checkPacketSend(true);
break;
}
}
void NetConnection::demoPlaybackComplete()
{
}
void NetConnection::stopDemoPlayback()
{
demoPlaybackComplete();
deleteObject();
}
bool NetConnection::processNextBlock()
{
U8 buffer[MaxPacketDataSize];
// read in and handle
if(mDemoReadStream->read(mDemoNextBlockSize, buffer))
handleRecordedBlock(mDemoNextBlockType, mDemoNextBlockSize, buffer);
U16 typeSize;
mDemoReadStream->read(&typeSize);
mDemoNextBlockType = typeSize >> 12;
mDemoNextBlockSize = typeSize & 0xFFF;
if(mDemoReadStream->getStatus() != Stream::Ok)
{
stopDemoPlayback();
return false;
}
return true;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// some handy string functions for compressing strings over a connection:
enum NetStringConstants
{
NullString = 0,
CString,
TagString,
Integer
};
void NetConnection::validateSendString(const char *str)
{
if(U8(*str) == StringTagPrefixByte)
{
StringHandle strHandle(dAtoi(str + 1));
checkString(strHandle);
}
}
void NetConnection::packString(BitStream *stream, const char *str)
{
char buf[16];
if(!*str)
{
stream->writeInt(NullString, 2);
return;
}
if(U8(str[0]) == StringTagPrefixByte)
{
stream->writeInt(TagString, 2);
stream->writeInt(dAtoi(str + 1), ConnectionStringTable::EntryBitSize);
return;
}
if(str[0] == '-' || (str[0] >= '0' && str[0] <= '9'))
{
S32 num = dAtoi(str);
dSprintf(buf, sizeof(buf), "%d", num);
if(!dStrcmp(buf, str))
{
stream->writeInt(Integer, 2);
if(stream->writeFlag(num < 0))
num = -num;
if(stream->writeFlag(num < 128))
{
stream->writeInt(num, 7);
return;
}
if(stream->writeFlag(num < 32768))
{
stream->writeInt(num, 15);
return;
}
else
{
stream->writeInt(num, 31);
return;
}
}
}
stream->writeInt(CString, 2);
stream->writeString(str);
}
void NetConnection::unpackString(BitStream *stream, char readBuffer[1024])
{
U32 code = stream->readInt(2);
switch(code)
{
case NullString:
readBuffer[0] = 0;
return;
case CString:
stream->readString(readBuffer);
return;
case TagString:
U32 tag;
tag = stream->readInt(ConnectionStringTable::EntryBitSize);
readBuffer[0] = StringTagPrefixByte;
dSprintf(readBuffer+1, 1023, "%d", tag);
return;
case Integer:
bool neg;
neg = stream->readFlag();
U32 num;
if(stream->readFlag())
num = stream->readInt(7);
else if(stream->readFlag())
num = stream->readInt(15);
else
num = stream->readInt(31);
if(neg)
num = -num;
dSprintf(readBuffer, 1024, "%d", num);
}
}
void NetConnection::packStringHandleU(BitStream *stream, StringHandle &h)
{
if(stream->writeFlag(h.isValidString() ))
{
bool isReceived;
U32 netIndex = checkString(h, &isReceived);
if(stream->writeFlag(isReceived))
stream->writeInt(netIndex, ConnectionStringTable::EntryBitSize);
else
stream->writeString(h.getString());
}
}
StringHandle NetConnection::unpackStringHandleU(BitStream *stream)
{
StringHandle ret;
if(stream->readFlag())
{
if(stream->readFlag())
ret = mStringTable->lookupString(stream->readInt(ConnectionStringTable::EntryBitSize));
else
{
char buf[256];
stream->readString(buf);
ret = StringHandle(buf);
}
}
return ret;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void NetConnection::setAddressDigest(U32 digest[4])
{
mAddressDigest[0] = digest[0];
mAddressDigest[1] = digest[1];
mAddressDigest[2] = digest[2];
mAddressDigest[3] = digest[3];
}
void NetConnection::getAddressDigest(U32 digest[4])
{
digest[0] = mAddressDigest[0];
digest[1] = mAddressDigest[1];
digest[2] = mAddressDigest[2];
digest[3] = mAddressDigest[3];
}
bool NetConnection::canRemoteCreate()
{
return false;
}
void NetConnection::onTimedOut()
{
}
void NetConnection::connect(const NetAddress *address)
{
mNetAddress = *address;
GNet->startConnection(this);
}
void NetConnection::onConnectTimedOut()
{
}
void NetConnection::sendDisconnectPacket(const char *reason)
{
GNet->sendDisconnectPacket(this, reason);
}
void NetConnection::onDisconnect(const char *reason)
{
reason;
}
void NetConnection::onConnectionRejected(const char *reason)
{
}
void NetConnection::onConnectionEstablished(bool isInitiator)
{
}
void NetConnection::handleStartupError(const char *errorString)
{
}
void NetConnection::writeConnectRequest(BitStream *stream)
{
stream->write(mNetClassGroup);
stream->write(U32(AbstractClassRep::getClassCRC(mNetClassGroup)));
}
bool NetConnection::readConnectRequest(BitStream *stream, const char **errorString)
{
U32 classGroup, classCRC;
stream->read(&classGroup);
stream->read(&classCRC);
if(classGroup == mNetClassGroup && classCRC == AbstractClassRep::getClassCRC(mNetClassGroup))
return true;
*errorString = "CHR_INVALID";
return false;
}
void NetConnection::writeConnectAccept(BitStream *stream)
{
stream;
}
bool NetConnection::readConnectAccept(BitStream *stream, const char **errorString)
{
stream;
errorString;
return true;
}
ConsoleMethod(NetConnection, resolveGhostID, S32, 3, 3, "( S32 ghostID ) Convert a ghost id from this connection to a real id.")
{
S32 gID = dAtoi(argv[2]);
// Safety check
if(gID < 0 || gID > GhostConnection::MaxGhostCount) return 0;
NetObject *foo = object->resolveGhost(gID);
if(foo)
return foo->getId();
else
return 0;
}
ConsoleMethod(NetConnection, resolveObjectFromGhostIndex, S32, 3, 3, "( S32 ghostIdx) Convert a ghost index from this connection to a real id.")
{
S32 gID = dAtoi(argv[2]);
// Safety check
if(gID < 0 || gID > GhostConnection::MaxGhostCount) return 0;
NetObject *foo = object->resolveObjectFromGhostIndex(gID);
if(foo)
return foo->getId();
else
return 0;
}
ConsoleMethod(NetConnection, getGhostID, S32, 3, 3, "( S32 realID ) Convert a real id to the ghost id for this connection.")
{
NetObject * foo;
if(Sim::findObject(argv[2], foo))
{
return object->getGhostIndex(foo);
}
else
{
Con::errorf("NetConnection::serverToGhostID - could not find specified object");
return -1;
}
}
ConsoleMethod(NetConnection, connect, void, 3, 3, "(string remoteAddress) Connects this NC object to the remote address.")
{
NetAddress addr;
if(!Net::stringToAddress(argv[2], &addr))
{
Con::errorf("NetConnection::connect: invalid address - %s", argv[2]);
return;
}
object->connect(&addr);
}
ConsoleMethod(NetConnection, connectLocal, const char *, 2, 2, "Connects a connection to the server running in the same process.")
{
ConsoleObject *co = ConsoleObject::create(object->getClassName());
NetConnection *client = object;
NetConnection *server = dynamic_cast<NetConnection *>(co);
const char *error = NULL;
BitStream *stream = BitStream::getPacketStream();
if(!server || !server->canRemoteCreate())
goto errorOut;
server->registerObject();
server->setIsLocalClientConnection();
server->setSequence(0);
client->setSequence(0);
client->setRemoteConnectionObject(server);
server->setRemoteConnectionObject(client);
stream->setPosition(0);
client->writeConnectRequest(stream);
stream->setPosition(0);
if(!server->readConnectRequest(stream, &error))
goto errorOut;
stream->setPosition(0);
server->writeConnectAccept(stream);
stream->setPosition(0);
if(!client->readConnectAccept(stream, &error))
goto errorOut;
client->onConnectionEstablished(true);
server->onConnectionEstablished(false);
client->setEstablished();
server->setEstablished();
client->setConnectSequence(0);
server->setConnectSequence(0);
NetConnection::setLocalClientConnection(server);
server->assignName("LocalClientConnection");
return "";
errorOut:
server->deleteObject();
client->deleteObject();
if(!error)
error = "Unknown Error";
return error;
}
#endif //#ifndef _USE_TGE_NETCONNTION_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -