feat: enhance DomainList packet handling and add connection denied response
This commit is contained in:
@@ -359,22 +359,27 @@ void OverteClient::parseEntityPacket(const char* data, size_t len) {
|
|||||||
|
|
||||||
void OverteClient::handleDomainListReply(const char* data, size_t len) {
|
void OverteClient::handleDomainListReply(const char* data, size_t len) {
|
||||||
// DomainList packet contains mixer endpoints
|
// DomainList packet contains mixer endpoints
|
||||||
// Format: sequence of [NodeType:u8][UUID:16bytes][PublicSocket:sockaddr][LocalSocket:sockaddr]
|
// Format: [NumNodes:u8] followed by sequence of:
|
||||||
|
// [NodeType:u8][UUID:16bytes][PublicSocket:sockaddr][LocalSocket:sockaddr]
|
||||||
std::cout << "[OverteClient] DomainList reply received (" << len << " bytes)" << std::endl;
|
std::cout << "[OverteClient] DomainList reply received (" << len << " bytes)" << std::endl;
|
||||||
|
|
||||||
if (len < 1) return;
|
if (len < 1) return;
|
||||||
|
|
||||||
// Parse number of nodes
|
unsigned char numNodes = static_cast<unsigned char>(data[0]);
|
||||||
size_t offset = 0;
|
std::cout << "[OverteClient] Number of assignment clients: " << (int)numNodes << std::endl;
|
||||||
|
|
||||||
while (offset + 1 < len) {
|
size_t offset = 1;
|
||||||
unsigned char nodeType = data[offset++];
|
|
||||||
|
for (int i = 0; i < numNodes && offset < len; ++i) {
|
||||||
|
// Read NodeType
|
||||||
|
if (offset + 1 > len) break;
|
||||||
|
unsigned char nodeType = static_cast<unsigned char>(data[offset++]);
|
||||||
|
|
||||||
// Skip UUID (16 bytes)
|
// Skip UUID (16 bytes)
|
||||||
if (offset + 16 > len) break;
|
if (offset + 16 > len) break;
|
||||||
offset += 16;
|
offset += 16;
|
||||||
|
|
||||||
// Read public socket address (sockaddr_in or sockaddr_in6)
|
// Read public socket address
|
||||||
if (offset + sizeof(sockaddr_in) > len) break;
|
if (offset + sizeof(sockaddr_in) > len) break;
|
||||||
|
|
||||||
sockaddr_in publicAddr;
|
sockaddr_in publicAddr;
|
||||||
@@ -386,7 +391,8 @@ void OverteClient::handleDomainListReply(const char* data, size_t len) {
|
|||||||
offset += sizeof(sockaddr_in);
|
offset += sizeof(sockaddr_in);
|
||||||
|
|
||||||
// NodeType values from Overte:
|
// NodeType values from Overte:
|
||||||
// 0 = DomainServer, 1 = EntityServer, 2 = Agent, 3 = AudioMixer, 4 = AvatarMixer, 5 = AssetServer, 6 = MessagesMixer, 7 = EntityScriptServer
|
// 0 = DomainServer, 1 = EntityServer, 2 = Agent, 3 = AudioMixer,
|
||||||
|
// 4 = AvatarMixer, 5 = AssetServer, 6 = MessagesMixer, 7 = EntityScriptServer
|
||||||
const unsigned char NODE_TYPE_ENTITY_SERVER = 1;
|
const unsigned char NODE_TYPE_ENTITY_SERVER = 1;
|
||||||
const unsigned char NODE_TYPE_AVATAR_MIXER = 4;
|
const unsigned char NODE_TYPE_AVATAR_MIXER = 4;
|
||||||
const unsigned char NODE_TYPE_AUDIO_MIXER = 3;
|
const unsigned char NODE_TYPE_AUDIO_MIXER = 3;
|
||||||
@@ -395,12 +401,24 @@ void OverteClient::handleDomainListReply(const char* data, size_t len) {
|
|||||||
inet_ntop(AF_INET, &publicAddr.sin_addr, addrStr, sizeof(addrStr));
|
inet_ntop(AF_INET, &publicAddr.sin_addr, addrStr, sizeof(addrStr));
|
||||||
int port = ntohs(publicAddr.sin_port);
|
int port = ntohs(publicAddr.sin_port);
|
||||||
|
|
||||||
std::cout << "[OverteClient] Mixer discovered: type=" << (int)nodeType
|
const char* nodeTypeName = "Unknown";
|
||||||
<< " addr=" << addrStr << ":" << port << std::endl;
|
switch (nodeType) {
|
||||||
|
case 0: nodeTypeName = "DomainServer"; break;
|
||||||
|
case NODE_TYPE_ENTITY_SERVER: nodeTypeName = "EntityServer"; break;
|
||||||
|
case 2: nodeTypeName = "Agent"; break;
|
||||||
|
case NODE_TYPE_AUDIO_MIXER: nodeTypeName = "AudioMixer"; break;
|
||||||
|
case NODE_TYPE_AVATAR_MIXER: nodeTypeName = "AvatarMixer"; break;
|
||||||
|
case 5: nodeTypeName = "AssetServer"; break;
|
||||||
|
case 6: nodeTypeName = "MessagesMixer"; break;
|
||||||
|
case 7: nodeTypeName = "EntityScriptServer"; break;
|
||||||
|
}
|
||||||
|
|
||||||
if (nodeType == NODE_TYPE_ENTITY_SERVER && !m_entityServerReady) {
|
std::cout << "[OverteClient] Assignment: " << nodeTypeName
|
||||||
|
<< " at " << addrStr << ":" << port << std::endl;
|
||||||
|
|
||||||
|
if (nodeType == NODE_TYPE_ENTITY_SERVER) {
|
||||||
// Update EntityServer connection to use discovered address
|
// Update EntityServer connection to use discovered address
|
||||||
std::cout << "[OverteClient] Using discovered EntityServer at " << addrStr << ":" << port << std::endl;
|
std::cout << "[OverteClient] Connecting to EntityServer at " << addrStr << ":" << port << std::endl;
|
||||||
|
|
||||||
// Update target address for EntityServer
|
// Update target address for EntityServer
|
||||||
sockaddr_in* entityAddr = reinterpret_cast<sockaddr_in*>(&m_entityAddr);
|
sockaddr_in* entityAddr = reinterpret_cast<sockaddr_in*>(&m_entityAddr);
|
||||||
@@ -409,12 +427,26 @@ void OverteClient::handleDomainListReply(const char* data, size_t len) {
|
|||||||
entityAddr->sin_addr = publicAddr.sin_addr;
|
entityAddr->sin_addr = publicAddr.sin_addr;
|
||||||
m_entityAddrLen = sizeof(sockaddr_in);
|
m_entityAddrLen = sizeof(sockaddr_in);
|
||||||
|
|
||||||
|
m_entityServerReady = true;
|
||||||
|
|
||||||
// Send EntityQuery to request all entities
|
// Send EntityQuery to request all entities
|
||||||
sendEntityQuery();
|
sendEntityQuery();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OverteClient::handleDomainConnectionDenied(const char* data, size_t len) {
|
||||||
|
std::cerr << "[OverteClient] Domain connection DENIED!" << std::endl;
|
||||||
|
|
||||||
|
// Parse reason if available
|
||||||
|
if (len > 0) {
|
||||||
|
std::string reason(data, len);
|
||||||
|
std::cerr << "[OverteClient] Reason: " << reason << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_domainConnected = false;
|
||||||
|
}
|
||||||
|
|
||||||
void OverteClient::sendDomainListRequest() {
|
void OverteClient::sendDomainListRequest() {
|
||||||
// Send DomainList request packet (PacketType 0x02 typically)
|
// Send DomainList request packet (PacketType 0x02 typically)
|
||||||
if (!m_udpReady || m_udpFd == -1) return;
|
if (!m_udpReady || m_udpFd == -1) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user