From 0bfea6a2f01b0c27de0f5efd04cd67c72a3beab1 Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 00:23:19 -0800 Subject: [PATCH 1/9] 1 --- src/api/iptux-core/Models.h | 25 ++++++++-- src/iptux-core/Models.cpp | 94 +++++++++++++++++++++++++++++++++-- src/iptux-core/ModelsTest.cpp | 39 +++++++++++++++ 3 files changed, 150 insertions(+), 8 deletions(-) diff --git a/src/api/iptux-core/Models.h b/src/api/iptux-core/Models.h index ed9f42e59..55bf831df 100644 --- a/src/api/iptux-core/Models.h +++ b/src/api/iptux-core/Models.h @@ -13,6 +13,7 @@ #define IPTUX_MODELS_H #include +#include #include #include #include @@ -56,17 +57,33 @@ typedef enum { class PalKey { public: PalKey(in_addr ipv4, int port); + explicit PalKey(GSocketAddress* address); + ~PalKey(); + + // Copy constructor + PalKey(const PalKey& other); + + // Copy assignment operator + PalKey& operator=(const PalKey& other); + + // Move constructor + PalKey(PalKey&& other) noexcept; + + // Move assignment operator + PalKey& operator=(PalKey&& other) noexcept; bool operator==(const PalKey& rhs) const; - in_addr GetIpv4() const { return ipv4; } + in_addr GetIpv4() const; std::string GetIpv4String() const; - int GetPort() const { return port; } + int GetPort() const; std::string ToString() const; + + // Get the underlying GSocketAddress (increases reference count) + GSocketAddress* GetSocketAddress() const; private: - in_addr ipv4; - int port; + GSocketAddress* address_; }; /** diff --git a/src/iptux-core/Models.cpp b/src/iptux-core/Models.cpp index 8de2dd3dc..c8a8f3d2b 100644 --- a/src/iptux-core/Models.cpp +++ b/src/iptux-core/Models.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -254,18 +255,103 @@ string ChipData::getSummary() const { return ""; } -PalKey::PalKey(in_addr ipv4, int port) : ipv4(ipv4), port(port) {} +PalKey::PalKey(in_addr ipv4, int port) { + GInetAddress* inet_addr = g_inet_address_new_from_bytes( + reinterpret_cast(&ipv4), G_SOCKET_FAMILY_IPV4); + address_ = g_inet_socket_address_new(inet_addr, port); + g_object_unref(inet_addr); +} + +PalKey::PalKey(GSocketAddress* address) { + address_ = G_SOCKET_ADDRESS(g_object_ref(address)); +} + +PalKey::~PalKey() { + if (address_) { + g_object_unref(address_); + } +} + +PalKey::PalKey(const PalKey& other) { + address_ = G_SOCKET_ADDRESS(g_object_ref(other.address_)); +} + +PalKey& PalKey::operator=(const PalKey& other) { + if (this != &other) { + if (address_) { + g_object_unref(address_); + } + address_ = G_SOCKET_ADDRESS(g_object_ref(other.address_)); + } + return *this; +} + +PalKey::PalKey(PalKey&& other) noexcept : address_(other.address_) { + other.address_ = nullptr; +} + +PalKey& PalKey::operator=(PalKey&& other) noexcept { + if (this != &other) { + if (address_) { + g_object_unref(address_); + } + address_ = other.address_; + other.address_ = nullptr; + } + return *this; +} + +in_addr PalKey::GetIpv4() const { + GInetAddress* inet_addr = g_inet_socket_address_get_address( + G_INET_SOCKET_ADDRESS(address_)); + + in_addr result; + gsize size = g_inet_address_get_native_size(inet_addr); + if (size == sizeof(in_addr)) { + memcpy(&result, g_inet_address_to_bytes(inet_addr), sizeof(in_addr)); + } else { + // Should not happen for IPv4 + memset(&result, 0, sizeof(in_addr)); + } + return result; +} string PalKey::GetIpv4String() const { - return inAddrToString(ipv4); + GInetAddress* inet_addr = g_inet_socket_address_get_address( + G_INET_SOCKET_ADDRESS(address_)); + gchar* str = g_inet_address_to_string(inet_addr); + string result(str); + g_free(str); + return result; +} + +int PalKey::GetPort() const { + return g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(address_)); } bool PalKey::operator==(const PalKey& rhs) const { - return ipv4Equal(this->ipv4, rhs.ipv4) && this->port == rhs.port; + GInetSocketAddress* this_addr = G_INET_SOCKET_ADDRESS(this->address_); + GInetSocketAddress* other_addr = G_INET_SOCKET_ADDRESS(rhs.address_); + + // Compare ports + if (g_inet_socket_address_get_port(this_addr) != + g_inet_socket_address_get_port(other_addr)) { + return false; + } + + // Compare addresses + GInetAddress* this_inet = g_inet_socket_address_get_address(this_addr); + GInetAddress* other_inet = g_inet_socket_address_get_address(other_addr); + + return g_inet_address_equal(this_inet, other_inet); } string PalKey::ToString() const { - return stringFormat("%s:%d", inAddrToString(ipv4).c_str(), port); + return stringFormat("%s:%d", GetIpv4String().c_str(), GetPort()); +} + +GSocketAddress* PalKey::GetSocketAddress() const { + return G_SOCKET_ADDRESS(g_object_ref(address_)); } bool FileInfo::operator==(const FileInfo& rhs) const { diff --git a/src/iptux-core/ModelsTest.cpp b/src/iptux-core/ModelsTest.cpp index d9dba76ff..383d8809a 100644 --- a/src/iptux-core/ModelsTest.cpp +++ b/src/iptux-core/ModelsTest.cpp @@ -24,6 +24,45 @@ TEST(PalKey, GetIpv4String) { ASSERT_EQ(key1.GetIpv4String(), "1.2.3.4"); } +TEST(PalKey, GSocketAddressConstructor) { + // Test creating PalKey from GSocketAddress + GInetAddress* inet_addr = g_inet_address_new_from_string("192.168.1.100"); + ASSERT_NE(inet_addr, nullptr); + + GSocketAddress* socket_addr = g_inet_socket_address_new(inet_addr, 8080); + ASSERT_NE(socket_addr, nullptr); + + PalKey key(socket_addr); + + // Test that the values are correctly extracted + ASSERT_EQ(key.GetIpv4String(), "192.168.1.100"); + ASSERT_EQ(key.GetPort(), 8080); + ASSERT_EQ(key.ToString(), "192.168.1.100:8080"); + + // Test GetSocketAddress method + GSocketAddress* retrieved_addr = key.GetSocketAddress(); + ASSERT_NE(retrieved_addr, nullptr); + + // Verify the retrieved address matches + GInetSocketAddress* inet_socket_addr = G_INET_SOCKET_ADDRESS(retrieved_addr); + ASSERT_EQ(g_inet_socket_address_get_port(inet_socket_addr), 8080); + + GInetAddress* retrieved_inet = + g_inet_socket_address_get_address(inet_socket_addr); + gchar* ip_str = g_inet_address_to_string(retrieved_inet); + ASSERT_STREQ(ip_str, "192.168.1.100"); + g_free(ip_str); + + // Test equality with another PalKey created from in_addr + PalKey key2(inAddrFromString("192.168.1.100"), 8080); + ASSERT_EQ(key, key2); + + // Cleanup + g_object_unref(retrieved_addr); + g_object_unref(socket_addr); + g_object_unref(inet_addr); +} + TEST(NetSegment, ContainIP) { NetSegment netSegment("1.2.3.4", "1.2.4.5", ""); From b7045ac0095e23565c55edf8853c64f3ad1eac0f Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 13:38:17 -0800 Subject: [PATCH 2/9] 1 --- src/iptux-core/internal/UdpData.cpp | 76 ++++++++++++------- src/iptux-core/internal/UdpData.h | 16 ++-- src/iptux-core/internal/UdpDataService.cpp | 33 +++----- src/iptux-core/internal/UdpDataService.h | 8 +- .../internal/UdpDataServiceTest.cpp | 31 ++++++-- src/iptux-core/internal/UdpDataTest.cpp | 17 ++++- 6 files changed, 110 insertions(+), 71 deletions(-) diff --git a/src/iptux-core/internal/UdpData.cpp b/src/iptux-core/internal/UdpData.cpp index 701445548..26229efdc 100644 --- a/src/iptux-core/internal/UdpData.cpp +++ b/src/iptux-core/internal/UdpData.cpp @@ -42,11 +42,11 @@ namespace iptux { * 类构造函数. */ UdpData::UdpData(CoreThread& coreThread, - in_addr ipv4, + GSocketAddress* addr, const char buf_[], size_t size_) : coreThread(coreThread), - ipv4(ipv4), + addr_(G_SOCKET_ADDRESS(g_object_ref(addr))), size(size_ < MAX_UDPLEN ? size_ : MAX_UDPLEN), encode(NULL) { memcpy(buf, buf_, size); @@ -60,6 +60,9 @@ UdpData::UdpData(CoreThread& coreThread, */ UdpData::~UdpData() { g_free(encode); + if (addr_) { + g_object_unref(addr_); + } } /** @@ -73,8 +76,8 @@ void UdpData::SomeoneLost() { auto g_progdt = coreThread.getProgramData(); /* 创建好友数据 */ - pal = new PalInfo(ipv4, coreThread.port()); - pal->segdes = g_strdup(g_progdt->FindNetSegDescription(ipv4).c_str()); + pal = new PalInfo(getIpv4(), coreThread.port()); + pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getIpv4()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); auto host = iptux_get_section_string(buf, ':', 3); @@ -114,9 +117,9 @@ void UdpData::SomeoneEntry() { /* 加入或更新好友列表 */ coreThread.Lock(); - if ((pal = coreThread.GetPal(ipv4))) { + if ((pal = coreThread.GetPal(getIpv4()))) { UpdatePalInfo(pal.get()); - coreThread.UpdatePalToList(ipv4); + coreThread.UpdatePalToList(getIpv4()); } else { pal = CreatePalInfo(); coreThread.AttachPalToList(pal); @@ -136,7 +139,7 @@ void UdpData::SomeoneEntry() { * 好友退出. */ void UdpData::SomeoneExit() { - coreThread.emitSomeoneExit(PalKey(ipv4, coreThread.port())); + coreThread.emitSomeoneExit(getPalKey()); } /** @@ -156,9 +159,9 @@ void UdpData::SomeoneAnsEntry() { /* 加入或更新好友列表 */ coreThread.Lock(); shared_ptr pal; - if ((pal = coreThread.GetPal(ipv4))) { + if ((pal = coreThread.GetPal(getIpv4()))) { UpdatePalInfo(pal.get()); - coreThread.UpdatePalToList(ipv4); + coreThread.UpdatePalToList(getIpv4()); } else { pal = CreatePalInfo(); coreThread.AttachPalToList(pal); @@ -186,7 +189,7 @@ void UdpData::SomeoneAbsence() { auto g_progdt = coreThread.getProgramData(); /* 若好友不兼容iptux协议,则需转码 */ - pal = coreThread.GetPal(ipv4); // 利用好友链表只增不减的特性,无须加锁 + pal = coreThread.GetPal(getIpv4()); // 利用好友链表只增不减的特性,无须加锁 ptr = iptux_skip_string(buf, size, 3); if (!ptr || *ptr == '\0') { if (pal) { @@ -201,7 +204,7 @@ void UdpData::SomeoneAbsence() { coreThread.Lock(); if (pal) { UpdatePalInfo(pal.get()); - coreThread.UpdatePalToList(ipv4); + coreThread.UpdatePalToList(getIpv4()); } else { coreThread.AttachPalToList(CreatePalInfo()); } @@ -220,7 +223,7 @@ void UdpData::SomeoneSendmsg() { auto g_progdt = coreThread.getProgramData(); /* 如果对方兼容iptux协议,则无须再转换编码 */ - auto pal = coreThread.GetPal(ipv4); + auto pal = coreThread.GetPal(getIpv4()); if (!pal || !pal->isCompatible()) { if (pal) { ConvertEncode(pal->getEncode()); @@ -274,12 +277,12 @@ void UdpData::SomeoneRecvmsg() { uint32_t packetno; PPalInfo pal; - if ((pal = coreThread.GetPal(ipv4))) { + if ((pal = coreThread.GetPal(getIpv4()))) { packetno = iptux_get_dec_number(buf, ':', 5); if (packetno == pal->rpacketn) pal->rpacketn = 0; // 标记此包编号已经被回复 } else { - LOG_WARN("message from unknown pal: %s", inAddrToString(ipv4).c_str()); + LOG_WARN("message from unknown pal: %s", getIpv4String().c_str()); } } @@ -291,7 +294,7 @@ void UdpData::SomeoneAskShared() { PPalInfo pal; char* passwd; - if (!(pal = coreThread.GetPal(ipv4))) + if (!(pal = coreThread.GetPal(getIpv4()))) return; auto limit = coreThread.GetAccessPublicLimit(); @@ -321,7 +324,7 @@ void UdpData::SomeoneSendIcon() { PPalInfo pal; string iconfile; - if (!(pal = coreThread.GetPal(ipv4)) || pal->isChanged()) { + if (!(pal = coreThread.GetPal(getIpv4())) || pal->isChanged()) { return; } @@ -329,7 +332,7 @@ void UdpData::SomeoneSendIcon() { iconfile = RecvPalIcon(); if (!iconfile.empty()) { pal->set_icon_file(iconfile); - coreThread.EmitIconUpdate(PalKey(ipv4, coreThread.port())); + coreThread.EmitIconUpdate(getPalKey()); } } @@ -340,7 +343,7 @@ void UdpData::SomeoneSendSign() { PPalInfo pal; char* sign; - if (!(pal = coreThread.GetPal(ipv4))) + if (!(pal = coreThread.GetPal(getIpv4()))) return; /* 若好友不兼容iptux协议,则需转码 */ @@ -356,7 +359,7 @@ void UdpData::SomeoneSendSign() { g_free(pal->sign); pal->sign = sign; coreThread.Lock(); - coreThread.UpdatePalToList(ipv4); + coreThread.UpdatePalToList(getIpv4()); coreThread.Unlock(); coreThread.emitNewPalOnline(pal->GetKey()); } @@ -372,7 +375,7 @@ void UdpData::SomeoneBcstmsg() { auto g_progdt = coreThread.getProgramData(); /* 如果对方兼容iptux协议,则无须再转换编码 */ - auto pal = coreThread.GetPal(ipv4); + auto pal = coreThread.GetPal(getIpv4()); if (!pal || !pal->isCompatible()) { if (pal) { ConvertEncode(pal->getEncode()); @@ -423,8 +426,8 @@ void UdpData::SomeoneBcstmsg() { */ shared_ptr UdpData::CreatePalInfo() { auto programData = coreThread.getProgramData(); - auto pal = make_shared(ipv4, coreThread.port()); - pal->segdes = g_strdup(programData->FindNetSegDescription(ipv4).c_str()); + auto pal = make_shared(getIpv4(), coreThread.port()); + pal->segdes = g_strdup(programData->FindNetSegDescription(getIpv4()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); auto host = iptux_get_section_string(buf, ':', 3); @@ -464,7 +467,7 @@ void UdpData::UpdatePalInfo(PalInfo* pal) { auto g_progdt = coreThread.getProgramData(); g_free(pal->segdes); - pal->segdes = g_strdup(g_progdt->FindNetSegDescription(ipv4).c_str()); + pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getIpv4()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); auto host = iptux_get_section_string(buf, ':', 3); @@ -638,18 +641,18 @@ string UdpData::RecvPalIcon() { PPalInfo UdpData::AssertPalOnline() { PPalInfo pal; - if ((pal = coreThread.GetPal(ipv4))) { + if ((pal = coreThread.GetPal(getIpv4()))) { /* 既然好友不在线,那么他自然不在列表中 */ if (!pal->isOnline()) { pal->setOnline(true); coreThread.Lock(); - coreThread.UpdatePalToList(ipv4); + coreThread.UpdatePalToList(getIpv4()); coreThread.Unlock(); coreThread.emitNewPalOnline(pal->GetKey()); } } else { SomeoneLost(); - pal = coreThread.GetPal(ipv4); + pal = coreThread.GetPal(getIpv4()); } return pal; @@ -672,7 +675,7 @@ void UdpData::RecvPalFile() { [](CoreThread* coreThread, PPalInfo pal, string data, int packetno) { RecvFile::RecvEntry(coreThread, pal, data, packetno); }, - &coreThread, coreThread.GetPal(ipv4), data, packetno) + &coreThread, coreThread.GetPal(getIpv4()), data, packetno) .detach(); } } @@ -695,8 +698,25 @@ uint32_t UdpData::getCommandNo() const { return iptux_get_dec_number(buf, ':', 4); } +in_addr UdpData::getIpv4() const { + GInetSocketAddress* isa = G_INET_SOCKET_ADDRESS(addr_); + GInetAddress* ia = g_inet_socket_address_get_address(isa); + in_addr result; + memcpy(&result, g_inet_address_to_bytes(ia), sizeof(in_addr)); + return result; +} + string UdpData::getIpv4String() const { - return inAddrToString(ipv4); + GInetSocketAddress* isa = G_INET_SOCKET_ADDRESS(addr_); + GInetAddress* ia = g_inet_socket_address_get_address(isa); + gchar* str = g_inet_address_to_string(ia); + string result(str); + g_free(str); + return result; +} + +PalKey UdpData::getPalKey() const { + return PalKey(addr_); } CommandMode UdpData::getCommandMode() const { diff --git a/src/iptux-core/internal/UdpData.h b/src/iptux-core/internal/UdpData.h index d0a61924e..5f9d92dfb 100644 --- a/src/iptux-core/internal/UdpData.h +++ b/src/iptux-core/internal/UdpData.h @@ -24,11 +24,15 @@ namespace iptux { class UdpData { public: - UdpData(CoreThread& coreThread, in_addr ipv4, const char buf[], size_t size); + UdpData(CoreThread& coreThread, + GSocketAddress* addr, + const char buf[], + size_t size); ~UdpData(); - in_addr getIpv4() const { return ipv4; } + in_addr getIpv4() const; std::string getIpv4String() const; + PalKey getPalKey() const; uint32_t getCommandNo() const; CommandMode getCommandMode() const; @@ -64,10 +68,10 @@ class UdpData { private: CoreThread& coreThread; - in_addr ipv4; // 数据来自 - size_t size; // 缓冲区数据有效长度 - char buf[MAX_UDPLEN]; // 数据缓冲区 - char* encode; // 原数据编码(NULL意味着utf8) + GSocketAddress* addr_; // 数据来自 + size_t size; // 缓冲区数据有效长度 + char buf[MAX_UDPLEN]; // 数据缓冲区 + char* encode; // 原数据编码(NULL意味着utf8) private: static void ThreadAskSharedFile(CoreThread* coreThread, PPalInfo pal); diff --git a/src/iptux-core/internal/UdpDataService.cpp b/src/iptux-core/internal/UdpDataService.cpp index 8720adcf6..3d5a4c3b5 100644 --- a/src/iptux-core/internal/UdpDataService.cpp +++ b/src/iptux-core/internal/UdpDataService.cpp @@ -10,41 +10,32 @@ namespace iptux { UdpDataService::UdpDataService(CoreThread& coreThread) : core_thread_(coreThread) {} -unique_ptr UdpDataService::process(in_addr ipv4, - int port, +unique_ptr UdpDataService::process(GSocketAddress* peer, const char buf[], size_t size) { - return process(ipv4, port, buf, size, true); + return process(peer, buf, size, true); } unique_ptr UdpDataService::process(GSocketAddress* peer, const char buf[], - size_t size) { + size_t size, + bool run) { GInetSocketAddress* isa = G_INET_SOCKET_ADDRESS(peer); guint16 port = g_inet_socket_address_get_port(isa); GInetAddress* ia = g_inet_socket_address_get_address(isa); - char* ip = g_inet_address_to_string(ia); - - // TODO: too many conversions, optimize it - in_addr ipv4 = inAddrFromString(ip); - g_free(ip); - return process(ipv4, port, buf, size, true); -} -unique_ptr UdpDataService::process(in_addr ipv4, - int port, - const char buf[], - size_t size, - bool run) { if (Log::IsDebugEnabled()) { - LOG_DEBUG("received udp message from %s:%d, size %zu\n%s", - inAddrToString(ipv4).c_str(), port, size, + gchar* ip = g_inet_address_to_string(ia); + LOG_DEBUG("received udp message from %s:%d, size %zu\n%s", ip, port, size, stringDumpAsCString(string(buf, size)).c_str()); + g_free(ip); } else { - LOG_INFO("received udp message from %s:%d, size %zu", - inAddrToString(ipv4).c_str(), port, size); + gchar* ip = g_inet_address_to_string(ia); + LOG_INFO("received udp message from %s:%d, size %zu", ip, port, size); + g_free(ip); } - auto udata = make_unique(core_thread_, ipv4, buf, size); + + auto udata = make_unique(core_thread_, peer, buf, size); if (run) { process(*udata); diff --git a/src/iptux-core/internal/UdpDataService.h b/src/iptux-core/internal/UdpDataService.h index 2dfdde3fb..42f141e21 100644 --- a/src/iptux-core/internal/UdpDataService.h +++ b/src/iptux-core/internal/UdpDataService.h @@ -15,13 +15,7 @@ class UdpDataService { const char buf[], size_t size); - std::unique_ptr process(in_addr ipv4, - int port, - const char buf[], - size_t size); - - std::unique_ptr process(in_addr ipv4, - int port, + std::unique_ptr process(GSocketAddress* peer, const char buf[], size_t size, bool run); diff --git a/src/iptux-core/internal/UdpDataServiceTest.cpp b/src/iptux-core/internal/UdpDataServiceTest.cpp index 59b955f48..222fac53f 100644 --- a/src/iptux-core/internal/UdpDataServiceTest.cpp +++ b/src/iptux-core/internal/UdpDataServiceTest.cpp @@ -2,6 +2,7 @@ #include +#include "gio/gio.h" #include "iptux-core/TestHelper.h" #include "iptux-core/internal/UdpDataService.h" #include "iptux-utils/utils.h" @@ -9,18 +10,32 @@ using namespace std; using namespace iptux; +namespace { + +GSocketAddress* makeTestAddress(const char* ip, guint16 port) { + GInetAddress* inet_addr = g_inet_address_new_from_string(ip); + GSocketAddress* addr = g_inet_socket_address_new(inet_addr, port); + g_object_unref(inet_addr); + return addr; +} + +} // namespace + TEST(UdpDataService, process) { auto core = newCoreThread(); auto service = make_unique(*core.get()); - service->process(inAddrFromString("127.0.0.1"), 1234, "", 0, true); + GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); + service->process(addr, "", 0, true); + g_object_unref(addr); } TEST(UdpDataService, SomeoneEntry) { auto core = newCoreThread(); auto service = make_unique(*core.get()); const char* data = "iptux 0.8.0:1:lidaobing:lidaobing.lan:257:lidaobing"; - service->process(inAddrFromString("127.0.0.1"), 1234, data, strlen(data), - true); + GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); + service->process(addr, data, strlen(data), true); + g_object_unref(addr); } TEST(UdpDataService, CreatePalInfo) { @@ -31,8 +46,9 @@ TEST(UdpDataService, CreatePalInfo) { "0.8.0-b1:6:lidaobing:LIs-MacBook-Pro.local:259:中\xe4\xb8\x00\x00icon-" "tux.png\x00utf-8\x00"; auto service = make_unique(*core.get()); - auto udp = service->process(inAddrFromString("127.0.0.1"), 1234, data, - strlen(data), false); + GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); + auto udp = service->process(addr, data, strlen(data), false); + g_object_unref(addr); auto pal = udp->CreatePalInfo(); ASSERT_EQ(pal->toString(), "PalInfo(IP=127.0.0.1,name=中��,segdes=,version=1_iptux " @@ -47,8 +63,9 @@ TEST(UdpDataService, CreatePalInfo) { "0.8.0-b1:6:中\xe4\xb8:LIs-MacBook-Pro.local:259:" "中\xe4\xb8\x00\x00icon-tux.png\x00utf-8\x00"; auto service = make_unique(*core.get()); - auto udp = service->process(inAddrFromString("127.0.0.1"), 1234, data, - strlen(data), false); + GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); + auto udp = service->process(addr, data, strlen(data), false); + g_object_unref(addr); auto pal = udp->CreatePalInfo(); ASSERT_EQ(pal->toString(), "PalInfo(IP=127.0.0.1,name=中��,segdes=,version=1_iptux " diff --git a/src/iptux-core/internal/UdpDataTest.cpp b/src/iptux-core/internal/UdpDataTest.cpp index 07a36275e..9913b0da8 100644 --- a/src/iptux-core/internal/UdpDataTest.cpp +++ b/src/iptux-core/internal/UdpDataTest.cpp @@ -1,14 +1,27 @@ #include "gtest/gtest.h" +#include "gio/gio.h" #include "iptux-core/TestHelper.h" #include "iptux-core/internal/UdpData.h" -#include "iptux-utils/utils.h" using namespace std; using namespace iptux; +namespace { + +GSocketAddress* makeTestAddress(const char* ip, guint16 port) { + GInetAddress* inet_addr = g_inet_address_new_from_string(ip); + GSocketAddress* addr = g_inet_socket_address_new(inet_addr, port); + g_object_unref(inet_addr); + return addr; +} + +} // namespace + TEST(UdpData, getCommandNo) { auto coreThread = newCoreThread(); - UdpData data(*coreThread, inAddrFromString("127.0.0.1"), "", 0); + GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); + UdpData data(*coreThread, addr, "", 0); + g_object_unref(addr); ASSERT_EQ(data.getCommandNo(), 0U); } From 601565a3f17bc230126678864ad78c8c584004ed Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 13:41:41 -0800 Subject: [PATCH 3/9] 1 --- .../internal/UdpDataServiceTest.cpp | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/iptux-core/internal/UdpDataServiceTest.cpp b/src/iptux-core/internal/UdpDataServiceTest.cpp index 222fac53f..368ee54c9 100644 --- a/src/iptux-core/internal/UdpDataServiceTest.cpp +++ b/src/iptux-core/internal/UdpDataServiceTest.cpp @@ -39,39 +39,43 @@ TEST(UdpDataService, SomeoneEntry) { } TEST(UdpDataService, CreatePalInfo) { - auto core = newCoreThread(); - { - const char* data = - "1_iptux " - "0.8.0-b1:6:lidaobing:LIs-MacBook-Pro.local:259:中\xe4\xb8\x00\x00icon-" - "tux.png\x00utf-8\x00"; - auto service = make_unique(*core.get()); - GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); - auto udp = service->process(addr, data, strlen(data), false); - g_object_unref(addr); - auto pal = udp->CreatePalInfo(); - ASSERT_EQ(pal->toString(), + struct TestCase { + const char* data; + const char* expected; + }; + + TestCase testCases[] = { + { + .data = "1_iptux " + "0.8.0-b1:6:lidaobing:LIs-MacBook-Pro.local:259:" + "中\xe4\xb8\x00\x00" + "icon-tux.png\x00utf-8\x00", + .expected = "PalInfo(IP=127.0.0.1,name=中��,segdes=,version=1_iptux " + "0.8.0-b1,user=lidaobing,host=LIs-MacBook-Pro.local," + "group=,photo=(NULL),sign=(NULL),iconfile=icon-qq.png," + "encode=utf-8,packetn=0,rpacketn=0,compatible=0,online=1," + "changed=0,in_blacklist=0)", + }, + { + .data = "1_iptux " + "0.8.0-b1:6:中\xe4\xb8:LIs-MacBook-Pro.local:259:" + "中\xe4\xb8\x00\x00icon-tux.png\x00utf-8\x00", + .expected = "PalInfo(IP=127.0.0.1,name=中��,segdes=,version=1_iptux " - "0.8.0-b1,user=lidaobing,host=LIs-MacBook-Pro.local," - "group=,photo=(NULL),sign=(NULL),iconfile=icon-qq.png," - "encode=utf-8,packetn=0,rpacketn=0,compatible=0,online=1," - "changed=0,in_blacklist=0)"); - } - { - const char* data = - "1_iptux " - "0.8.0-b1:6:中\xe4\xb8:LIs-MacBook-Pro.local:259:" - "中\xe4\xb8\x00\x00icon-tux.png\x00utf-8\x00"; + "0.8.0-b1,user=中��,host=LIs-MacBook-Pro.local," + "group=,photo=(NULL),sign=(NULL),iconfile=icon-qq.png,encode=utf-" + "8,packetn=0,rpacketn=0,compatible=0,online=1,changed=0,in_" + "blacklist=0)", + }, + }; + + auto core = newCoreThread(); + for (const auto& tc : testCases) { auto service = make_unique(*core.get()); GSocketAddress* addr = makeTestAddress("127.0.0.1", 1234); - auto udp = service->process(addr, data, strlen(data), false); + auto udp = service->process(addr, tc.data, strlen(tc.data), false); g_object_unref(addr); auto pal = udp->CreatePalInfo(); - ASSERT_EQ(pal->toString(), - "PalInfo(IP=127.0.0.1,name=中��,segdes=,version=1_iptux " - "0.8.0-b1,user=中��,host=LIs-MacBook-Pro.local," - "group=,photo=(NULL),sign=(NULL),iconfile=icon-qq.png,encode=utf-" - "8,packetn=0,rpacketn=0,compatible=0,online=1,changed=0,in_" - "blacklist=0)"); + ASSERT_EQ(pal->toString(), tc.expected); } } From 878f36bb3bfe6a3caf1a563828ea22d0ece1cb96 Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 13:42:19 -0800 Subject: [PATCH 4/9] 1 --- src/iptux-core/internal/UdpDataServiceTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/iptux-core/internal/UdpDataServiceTest.cpp b/src/iptux-core/internal/UdpDataServiceTest.cpp index 368ee54c9..e28d536f5 100644 --- a/src/iptux-core/internal/UdpDataServiceTest.cpp +++ b/src/iptux-core/internal/UdpDataServiceTest.cpp @@ -5,7 +5,6 @@ #include "gio/gio.h" #include "iptux-core/TestHelper.h" #include "iptux-core/internal/UdpDataService.h" -#include "iptux-utils/utils.h" using namespace std; using namespace iptux; From 209773da8e2f7f9541cc211dd907089631363e4f Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 13:46:02 -0800 Subject: [PATCH 5/9] fix ut --- src/api/iptux-core/Models.h | 1 - src/iptux-core/ModelsTest.cpp | 1 + src/iptux-core/internal/RecvFileData.cpp | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/iptux-core/Models.h b/src/api/iptux-core/Models.h index 55bf831df..48898459b 100644 --- a/src/api/iptux-core/Models.h +++ b/src/api/iptux-core/Models.h @@ -12,7 +12,6 @@ #ifndef IPTUX_MODELS_H #define IPTUX_MODELS_H -#include #include #include #include diff --git a/src/iptux-core/ModelsTest.cpp b/src/iptux-core/ModelsTest.cpp index 383d8809a..2fe8e8d2a 100644 --- a/src/iptux-core/ModelsTest.cpp +++ b/src/iptux-core/ModelsTest.cpp @@ -3,6 +3,7 @@ #include "iptux-core/Models.h" #include "iptux-utils/TestHelper.h" #include "iptux-utils/utils.h" +#include using namespace std; using namespace iptux; diff --git a/src/iptux-core/internal/RecvFileData.cpp b/src/iptux-core/internal/RecvFileData.cpp index 741edc34f..c59dfb0b1 100644 --- a/src/iptux-core/internal/RecvFileData.cpp +++ b/src/iptux-core/internal/RecvFileData.cpp @@ -12,6 +12,7 @@ #include "config.h" #include "RecvFileData.h" +#include #include #include From 3c52b1b5eb322105ecc8b9c7c2fe12f7a99739cf Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 13:52:24 -0800 Subject: [PATCH 6/9] 1 --- src/api/iptux-core/Models.h | 2 +- src/iptux-core/Models.cpp | 19 ++++++++++++++++--- src/iptux-core/ModelsTest.cpp | 12 ++++++------ src/iptux-core/ProgramData.cpp | 6 +++++- src/iptux/UiHelper.cpp | 6 +++++- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/api/iptux-core/Models.h b/src/api/iptux-core/Models.h index 48898459b..7403fd874 100644 --- a/src/api/iptux-core/Models.h +++ b/src/api/iptux-core/Models.h @@ -252,7 +252,7 @@ class NetSegment { NetSegment(); ~NetSegment(); - bool ContainIP(in_addr ipv4) const; + bool ContainIP(GInetAddress* ipv4) const; /** * @brief return the ip count in this segment * diff --git a/src/iptux-core/Models.cpp b/src/iptux-core/Models.cpp index c8a8f3d2b..19d369241 100644 --- a/src/iptux-core/Models.cpp +++ b/src/iptux-core/Models.cpp @@ -203,9 +203,22 @@ std::string NetSegment::NthIp(uint64_t i) const { return inAddrToString(inAddrFromUint32(res)); } -bool NetSegment::ContainIP(in_addr ipv4) const { - return ipv4Compare(inAddrFromString(startip), ipv4) <= 0 && - ipv4Compare(ipv4, inAddrFromString(endip)) <= 0; +bool NetSegment::ContainIP(GInetAddress* ipv4) const { + GInetAddress* start = g_inet_address_new_from_string(startip.c_str()); + GInetAddress* end = g_inet_address_new_from_string(endip.c_str()); + + gsize size = g_inet_address_get_native_size(ipv4); + const guint8* ip_bytes = g_inet_address_to_bytes(ipv4); + const guint8* start_bytes = g_inet_address_to_bytes(start); + const guint8* end_bytes = g_inet_address_to_bytes(end); + + int cmp_start = memcmp(ip_bytes, start_bytes, size); + int cmp_end = memcmp(ip_bytes, end_bytes, size); + + g_object_unref(start); + g_object_unref(end); + + return cmp_start >= 0 && cmp_end <= 0; } Json::Value NetSegment::ToJsonValue() const { diff --git a/src/iptux-core/ModelsTest.cpp b/src/iptux-core/ModelsTest.cpp index 2fe8e8d2a..e3e757006 100644 --- a/src/iptux-core/ModelsTest.cpp +++ b/src/iptux-core/ModelsTest.cpp @@ -71,9 +71,9 @@ TEST(NetSegment, ContainIP) { "1.2.4.0", "1.2.3.5", "1.2.4.4"}; for (const string& ip : ips) { - in_addr ip1; - ASSERT_EQ(inet_pton(AF_INET, ip.c_str(), &ip1.s_addr), 1) << ip; - ASSERT_TRUE(netSegment.ContainIP(ip1)); + GInetAddress* addr = g_inet_address_new_from_string(ip.c_str()); + ASSERT_TRUE(netSegment.ContainIP(addr)) << ip; + g_object_unref(addr); } vector ips2 = { @@ -83,9 +83,9 @@ TEST(NetSegment, ContainIP) { "100.100.100.100", }; for (const string& ip : ips2) { - in_addr ip1; - ASSERT_EQ(inet_pton(AF_INET, ip.c_str(), &ip1), 1) << ip; - ASSERT_FALSE(netSegment.ContainIP(ip1)); + GInetAddress* addr = g_inet_address_new_from_string(ip.c_str()); + ASSERT_FALSE(netSegment.ContainIP(addr)) << ip; + g_object_unref(addr); } } diff --git a/src/iptux-core/ProgramData.cpp b/src/iptux-core/ProgramData.cpp index 54d43137f..7a423752d 100644 --- a/src/iptux-core/ProgramData.cpp +++ b/src/iptux-core/ProgramData.cpp @@ -110,11 +110,15 @@ void ProgramData::set_port(uint16_t port, bool is_init) { * @return 描述串 */ string ProgramData::FindNetSegDescription(in_addr ipv4) const { + GInetAddress* addr = g_inet_address_new_from_bytes( + reinterpret_cast(&ipv4), G_SOCKET_FAMILY_IPV4); for (size_t i = 0; i < netseg.size(); ++i) { - if (netseg[i].ContainIP(ipv4)) { + if (netseg[i].ContainIP(addr)) { + g_object_unref(addr); return netseg[i].description; } } + g_object_unref(addr); return ""; } diff --git a/src/iptux/UiHelper.cpp b/src/iptux/UiHelper.cpp index fbb341dfa..f1972f776 100644 --- a/src/iptux/UiHelper.cpp +++ b/src/iptux/UiHelper.cpp @@ -232,11 +232,15 @@ string ipv4_get_lan_name(in_addr ipv4) { static const char* localgroup[] = { "10.0.0.0", "10.255.255.255", "172.16.0.0", "172.31.255.255", "192.168.0.0", "192.168.255.255", NULL}; + GInetAddress* addr = g_inet_address_new_from_bytes( + reinterpret_cast(&ipv4), G_SOCKET_FAMILY_IPV4); for (int i = 0; i < 6; i += 2) { - if (NetSegment(localgroup[i], localgroup[i + 1], "").ContainIP(ipv4)) { + if (NetSegment(localgroup[i], localgroup[i + 1], "").ContainIP(addr)) { + g_object_unref(addr); return stringFormat("%s~%s", localgroup[i], localgroup[i + 1]); } } + g_object_unref(addr); return ""; } From 9cff2d21bc1f57cc11b951a70aacffb10fb6143a Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 13:58:35 -0800 Subject: [PATCH 7/9] 1 --- src/api/iptux-core/Models.h | 9 ++++----- src/iptux-core/Models.cpp | 36 ++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/api/iptux-core/Models.h b/src/api/iptux-core/Models.h index 7403fd874..0f1b20f09 100644 --- a/src/api/iptux-core/Models.h +++ b/src/api/iptux-core/Models.h @@ -99,7 +99,7 @@ class PalInfo { PalInfo(in_addr ipv4, uint16_t port); ~PalInfo(); - PalKey GetKey() const { return PalKey(ipv4(), port_); } + const PalKey& GetKey() const { return key_; } PalInfo& setName(const std::string& name); const std::string& getName() const { return name; } @@ -133,8 +133,8 @@ class PalInfo { } std::string toString() const; - in_addr ipv4() const { return ipv4_; } - uint16_t port() const { return port_; } + in_addr ipv4() const { return key_.GetIpv4(); } + uint16_t port() const { return key_.GetPort(); } char* segdes; ///< 所在网段描述 char* photo; ///< 形象照片 @@ -153,8 +153,7 @@ class PalInfo { PalInfo& setInBlacklist(bool value); private: - in_addr ipv4_; ///< 好友IP - uint16_t port_; ///< 好友端口 + PalKey key_; ///< 好友IP和端口 std::string icon_file_; ///< 好友头像 * std::string user; std::string name; diff --git a/src/iptux-core/Models.cpp b/src/iptux-core/Models.cpp index 19d369241..abb4eae41 100644 --- a/src/iptux-core/Models.cpp +++ b/src/iptux-core/Models.cpp @@ -28,24 +28,28 @@ using namespace std; namespace iptux { PalInfo::PalInfo(in_addr ipv4, uint16_t port) - : segdes(NULL), photo(NULL), sign(NULL), packetn(0), rpacketn(0) { - this->ipv4_ = ipv4; - this->port_ = port; - compatible = 0; - online = 0; - changed = 0; - in_blacklist = 0; -} + : segdes(NULL), + photo(NULL), + sign(NULL), + packetn(0), + rpacketn(0), + key_(ipv4, port), + compatible(0), + online(0), + changed(0), + in_blacklist(0) {} PalInfo::PalInfo(const string& ipv4, uint16_t port) - : segdes(NULL), photo(NULL), sign(NULL), packetn(0), rpacketn(0) { - this->ipv4_ = inAddrFromString(ipv4); - this->port_ = port; - compatible = 0; - online = 0; - changed = 0; - in_blacklist = 0; -} + : segdes(NULL), + photo(NULL), + sign(NULL), + packetn(0), + rpacketn(0), + key_(inAddrFromString(ipv4), port), + compatible(0), + online(0), + changed(0), + in_blacklist(0) {} PalInfo::~PalInfo() { g_free(segdes); From 6e1d3263efbeb963b8d76af5bf75dbdf319f2ad4 Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 14:03:49 -0800 Subject: [PATCH 8/9] 1 --- src/api/iptux-core/ProgramData.h | 2 +- src/iptux-core/ProgramData.cpp | 8 ++------ src/iptux-core/internal/UdpData.cpp | 10 +++++++--- src/iptux-core/internal/UdpData.h | 1 + 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/api/iptux-core/ProgramData.h b/src/api/iptux-core/ProgramData.h index d5e3f5dd2..e6842de48 100644 --- a/src/api/iptux-core/ProgramData.h +++ b/src/api/iptux-core/ProgramData.h @@ -35,7 +35,7 @@ class ProgramData { FileInfo* GetShareFileInfo(uint32_t fileId); FileInfo* GetShareFileInfo(uint32_t packetn, uint32_t filenum); - std::string FindNetSegDescription(in_addr ipv4) const; + std::string FindNetSegDescription(GInetAddress* ipv4) const; void Lock(); void Unlock(); diff --git a/src/iptux-core/ProgramData.cpp b/src/iptux-core/ProgramData.cpp index 7a423752d..f10a6b567 100644 --- a/src/iptux-core/ProgramData.cpp +++ b/src/iptux-core/ProgramData.cpp @@ -109,16 +109,12 @@ void ProgramData::set_port(uint16_t port, bool is_init) { * @param ipv4 ipv4 * @return 描述串 */ -string ProgramData::FindNetSegDescription(in_addr ipv4) const { - GInetAddress* addr = g_inet_address_new_from_bytes( - reinterpret_cast(&ipv4), G_SOCKET_FAMILY_IPV4); +string ProgramData::FindNetSegDescription(GInetAddress* ipv4) const { for (size_t i = 0; i < netseg.size(); ++i) { - if (netseg[i].ContainIP(addr)) { - g_object_unref(addr); + if (netseg[i].ContainIP(ipv4)) { return netseg[i].description; } } - g_object_unref(addr); return ""; } diff --git a/src/iptux-core/internal/UdpData.cpp b/src/iptux-core/internal/UdpData.cpp index 26229efdc..28b4c14aa 100644 --- a/src/iptux-core/internal/UdpData.cpp +++ b/src/iptux-core/internal/UdpData.cpp @@ -77,7 +77,7 @@ void UdpData::SomeoneLost() { /* 创建好友数据 */ pal = new PalInfo(getIpv4(), coreThread.port()); - pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getIpv4()).c_str()); + pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getInetAddress()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); auto host = iptux_get_section_string(buf, ':', 3); @@ -427,7 +427,7 @@ void UdpData::SomeoneBcstmsg() { shared_ptr UdpData::CreatePalInfo() { auto programData = coreThread.getProgramData(); auto pal = make_shared(getIpv4(), coreThread.port()); - pal->segdes = g_strdup(programData->FindNetSegDescription(getIpv4()).c_str()); + pal->segdes = g_strdup(programData->FindNetSegDescription(getInetAddress()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); auto host = iptux_get_section_string(buf, ':', 3); @@ -467,7 +467,7 @@ void UdpData::UpdatePalInfo(PalInfo* pal) { auto g_progdt = coreThread.getProgramData(); g_free(pal->segdes); - pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getIpv4()).c_str()); + pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getInetAddress()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); auto host = iptux_get_section_string(buf, ':', 3); @@ -706,6 +706,10 @@ in_addr UdpData::getIpv4() const { return result; } +GInetAddress* UdpData::getInetAddress() const { + return g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(addr_)); +} + string UdpData::getIpv4String() const { GInetSocketAddress* isa = G_INET_SOCKET_ADDRESS(addr_); GInetAddress* ia = g_inet_socket_address_get_address(isa); diff --git a/src/iptux-core/internal/UdpData.h b/src/iptux-core/internal/UdpData.h index 5f9d92dfb..7c63b7cf9 100644 --- a/src/iptux-core/internal/UdpData.h +++ b/src/iptux-core/internal/UdpData.h @@ -31,6 +31,7 @@ class UdpData { ~UdpData(); in_addr getIpv4() const; + GInetAddress* getInetAddress() const; std::string getIpv4String() const; PalKey getPalKey() const; From 6aead8ddc0f0e430a93ac43a930bc6b4d574cada Mon Sep 17 00:00:00 2001 From: LI Daobing Date: Sun, 25 Jan 2026 14:09:21 -0800 Subject: [PATCH 9/9] 1 --- src/api/iptux-core/Models.h | 2 +- src/iptux-core/Models.cpp | 4 ++-- src/iptux-core/internal/UdpData.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/api/iptux-core/Models.h b/src/api/iptux-core/Models.h index 0f1b20f09..3bd078c37 100644 --- a/src/api/iptux-core/Models.h +++ b/src/api/iptux-core/Models.h @@ -96,7 +96,7 @@ class PalKey { class PalInfo { public: PalInfo(const std::string& ipv4, uint16_t port); - PalInfo(in_addr ipv4, uint16_t port); + explicit PalInfo(const PalKey& key); ~PalInfo(); const PalKey& GetKey() const { return key_; } diff --git a/src/iptux-core/Models.cpp b/src/iptux-core/Models.cpp index abb4eae41..589d0c39a 100644 --- a/src/iptux-core/Models.cpp +++ b/src/iptux-core/Models.cpp @@ -27,13 +27,13 @@ using namespace std; namespace iptux { -PalInfo::PalInfo(in_addr ipv4, uint16_t port) +PalInfo::PalInfo(const PalKey& key) : segdes(NULL), photo(NULL), sign(NULL), packetn(0), rpacketn(0), - key_(ipv4, port), + key_(key), compatible(0), online(0), changed(0), diff --git a/src/iptux-core/internal/UdpData.cpp b/src/iptux-core/internal/UdpData.cpp index 28b4c14aa..3d419c0eb 100644 --- a/src/iptux-core/internal/UdpData.cpp +++ b/src/iptux-core/internal/UdpData.cpp @@ -76,7 +76,7 @@ void UdpData::SomeoneLost() { auto g_progdt = coreThread.getProgramData(); /* 创建好友数据 */ - pal = new PalInfo(getIpv4(), coreThread.port()); + pal = new PalInfo(getPalKey()); pal->segdes = g_strdup(g_progdt->FindNetSegDescription(getInetAddress()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2); @@ -426,7 +426,7 @@ void UdpData::SomeoneBcstmsg() { */ shared_ptr UdpData::CreatePalInfo() { auto programData = coreThread.getProgramData(); - auto pal = make_shared(getIpv4(), coreThread.port()); + auto pal = make_shared(getPalKey()); pal->segdes = g_strdup(programData->FindNetSegDescription(getInetAddress()).c_str()); auto version = iptux_get_section_string(buf, ':', 0); auto user = iptux_get_section_string(buf, ':', 2);