fix: update sendDomainConnectRequest to use correct IPv4Protocol tag and enhance protocol signature logging
This commit is contained in:
@@ -630,9 +630,11 @@ void OverteClient::sendDomainConnectRequest() {
|
|||||||
}
|
}
|
||||||
// Helper lambda to write QHostAddress (IPv4) in QDataStream format: [protocol:quint8=1][IPv4:quint32]
|
// Helper lambda to write QHostAddress (IPv4) in QDataStream format: [protocol:quint8=1][IPv4:quint32]
|
||||||
auto writeQHostAddressIPv4 = [&qs](uint32_t hostOrderIPv4){
|
auto writeQHostAddressIPv4 = [&qs](uint32_t hostOrderIPv4){
|
||||||
// QDataStream for QHostAddress writes a protocol tag (quint8). In Qt5, IPv4Protocol serializes as 0.
|
// QDataStream for QHostAddress writes a protocol tag (quint8).
|
||||||
qs.writeUInt8(0); // IPv4Protocol tag in Qt's QDataStream format
|
// QAbstractSocket::NetworkLayerProtocol: AnyIPProtocol=0, IPv4Protocol=1, IPv6Protocol=2.
|
||||||
qs.writeUInt32BE(hostOrderIPv4); // already host order -> big endian conversion inside writer
|
// We want IPv4Protocol = 1.
|
||||||
|
qs.writeUInt8(1);
|
||||||
|
qs.writeUInt32BE(hostOrderIPv4);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 10. Public socket: type (quint8) + SockAddr (QHostAddress + quint16 port, WITHOUT socket type per SockAddr QDataStream operator)
|
// 10. Public socket: type (quint8) + SockAddr (QHostAddress + quint16 port, WITHOUT socket type per SockAddr QDataStream operator)
|
||||||
@@ -667,8 +669,18 @@ void OverteClient::sendDomainConnectRequest() {
|
|||||||
// Print MD5 signature in hex for diff against reference Overte client
|
// Print MD5 signature in hex for diff against reference Overte client
|
||||||
std::ostringstream md5hex; md5hex << std::hex << std::setfill('0');
|
std::ostringstream md5hex; md5hex << std::hex << std::setfill('0');
|
||||||
for (uint8_t byte : protocolSig) md5hex << std::setw(2) << (int)byte;
|
for (uint8_t byte : protocolSig) md5hex << std::setw(2) << (int)byte;
|
||||||
std::cout << "[OverteClient] Protocol signature: " << protocolSig.size() << " bytes (MD5)" << std::endl;
|
// Base64 encode MD5 for comparison with Overte's protocolVersionsSignatureBase64()
|
||||||
std::cout << "[OverteClient] Protocol signature (hex): " << md5hex.str() << std::endl;
|
auto base64Encode = [](const std::vector<uint8_t>& in){
|
||||||
|
static const char* tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
std::string out; out.reserve(((in.size()+2)/3)*4);
|
||||||
|
size_t i=0; while(i<in.size()){ uint32_t val=0; int bytes=0; for(int j=0;j<3;++j){ val <<=8; if(i<in.size()){ val|=in[i++]; ++bytes; } }
|
||||||
|
int pad = 3 - bytes; for(int k=0;k<4-pad;++k){ int idx = (val >> (18 - k*6)) & 0x3F; out.push_back(tbl[idx]); }
|
||||||
|
for(int k=0;k<pad;++k) out.push_back('='); }
|
||||||
|
return out; };
|
||||||
|
std::string md5Base64 = base64Encode(protocolSig);
|
||||||
|
std::cout << "[OverteClient] Protocol signature: " << protocolSig.size() << " bytes (MD5)" << std::endl;
|
||||||
|
std::cout << "[OverteClient] Protocol signature (hex): " << md5hex.str() << std::endl;
|
||||||
|
std::cout << "[OverteClient] Protocol signature (base64): " << md5Base64 << std::endl;
|
||||||
// Hex dump first 64 bytes
|
// Hex dump first 64 bytes
|
||||||
std::cout << "[OverteClient] >>> NLPacket Hex: ";
|
std::cout << "[OverteClient] >>> NLPacket Hex: ";
|
||||||
for (size_t i = 0; i < std::min(size_t(64), data.size()); ++i) {
|
for (size_t i = 0; i < std::min(size_t(64), data.size()); ++i) {
|
||||||
|
|||||||
Reference in New Issue
Block a user