Add IPv6 support and sfDns

- Grow sfIpAddress to hold IPv6 addresses and add address types

- Make sfIpAddress_fromString not resolve network names anymore, matching sf::IpAddress::fromString, and add the deprecated sfIpAddress_resolve

- Add sfDns for resolving hostnames and querying NS, MX, SRV and TXT records
This commit is contained in:
Lukas Dürrenberger committed 2026-10-04 22:12:01 +02:00
1 parent 523c48cf98
commit 917e811888
16 files changed
+1112 -48

No files matched your search

+2 -1
View File
@@ -66,12 +66,13 @@ set_target_warnings(test-csfml-graphics)
catch_discover_tests(test-csfml-graphics WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_executable(test-csfml-network
Network/Dns.test.cpp
Network/Ftp.test.cpp
Network/Http.test.cpp
Network/IpAddress.test.cpp
Network/SocketStatus.test.cpp
)
target_link_libraries(test-csfml-network PRIVATE csfml-network Catch2::Catch2WithMain SFML::Network)
target_link_libraries(test-csfml-network PRIVATE csfml-network csfml-system Catch2::Catch2WithMain SFML::Network)
set_target_warnings(test-csfml-network)
catch_discover_tests(test-csfml-network)
+25
View File
@@ -0,0 +1,25 @@
#include <CSFML/Network/Dns.h>
#include <CSFML/System/Alloc.h>
#include <catch2/catch_test_macros.hpp>
#include <cstring>
TEST_CASE("[Network] sfDns")
{
SECTION("sfDns_resolve")
{
size_t count = 0;
sfIpAddress* addresses = sfDns_resolve("127.0.0.1", nullptr, 0, sfSeconds(1), &count);
REQUIRE(addresses != nullptr);
REQUIRE(count == 1);
CHECK(std::strcmp(addresses[0].address, "127.0.0.1") == 0);
sfFree(addresses);
addresses = sfDns_resolve("::1", nullptr, 0, sfSeconds(1), &count);
REQUIRE(addresses != nullptr);
REQUIRE(count == 1);
CHECK(std::strcmp(addresses[0].address, "::1") == 0);
sfFree(addresses);
}
}
+50 -1
View File
@@ -1,5 +1,7 @@
#include <CSFML/Network/IpAddress.h>
#include <SFML/Network/IpAddress.hpp>
#include <catch2/catch_test_macros.hpp>
#include <cstring>
@@ -17,15 +19,62 @@ TEST_CASE("[Network] sfIpAddress")
CHECK(std::strcmp(sfIpAddress_Any.address, "0.0.0.0") == 0);
CHECK(std::strcmp(sfIpAddress_LocalHost.address, "127.0.0.1") == 0);
CHECK(std::strcmp(sfIpAddress_Broadcast.address, "255.255.255.255") == 0);
CHECK(std::strcmp(sfIpAddress_AnyV4.address, "0.0.0.0") == 0);
CHECK(std::strcmp(sfIpAddress_LocalHostV4.address, "127.0.0.1") == 0);
CHECK(std::strcmp(sfIpAddress_BroadcastV4.address, "255.255.255.255") == 0);
CHECK(std::strcmp(sfIpAddress_AnyV6.address, "::") == 0);
CHECK(std::strcmp(sfIpAddress_LocalHostV6.address, "::1") == 0);
}
SECTION("sfIpAddressType")
{
STATIC_CHECK(sfIpAddressV4 == static_cast<int>(sf::IpAddress::Type::IpV4));
STATIC_CHECK(sfIpAddressV6 == static_cast<int>(sf::IpAddress::Type::IpV6));
}
SECTION("sfIpAddress_fromString")
{
CHECK(sfIpAddress_toInteger(sfIpAddress_fromString("")) == 0);
CHECK(sfIpAddress_toInteger(sfIpAddress_fromString("256.256.256.256")) == 0);
CHECK(sfIpAddress_toInteger(sfIpAddress_fromString("localhost")) == 0x7F000001);
CHECK(sfIpAddress_toInteger(sfIpAddress_fromString("localhost")) == 0);
CHECK(sfIpAddress_toInteger(sfIpAddress_fromString("192.168.0.1")) == 0xC0A80001);
CHECK(sfIpAddress_toInteger(sfIpAddress_fromString("8.8.8.8")) == 0x08080808);
CHECK(std::strcmp(sfIpAddress_fromString("2606:4700:4700::1111").address, "2606:4700:4700::1111") == 0);
CHECK(std::strcmp(sfIpAddress_fromString("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").address,
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") == 0);
}
SECTION("sfIpAddress_resolve")
{
CHECK(sfIpAddress_toInteger(sfIpAddress_resolve("")) == 0);
CHECK(sfIpAddress_toInteger(sfIpAddress_resolve("localhost")) == 0x7F000001);
CHECK(sfIpAddress_toInteger(sfIpAddress_resolve("192.168.0.1")) == 0xC0A80001);
}
SECTION("Type")
{
CHECK(sfIpAddress_isV4(sfIpAddress_LocalHostV4));
CHECK(!sfIpAddress_isV6(sfIpAddress_LocalHostV4));
CHECK(sfIpAddress_getType(sfIpAddress_LocalHostV4) == sfIpAddressV4);
CHECK(!sfIpAddress_isV4(sfIpAddress_LocalHostV6));
CHECK(sfIpAddress_isV6(sfIpAddress_LocalHostV6));
CHECK(sfIpAddress_getType(sfIpAddress_LocalHostV6) == sfIpAddressV6);
CHECK(!sfIpAddress_isV4(sfIpAddress_None));
CHECK(!sfIpAddress_isV6(sfIpAddress_None));
}
SECTION("sfIpAddress_fromV6Bytes")
{
const uint8_t bytes[16] = {0x26, 0x06, 0x47, 0x00, 0x47, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0x11, 0x11};
const sfIpAddress address = sfIpAddress_fromV6Bytes(bytes);
CHECK(std::strcmp(address.address, "2606:4700:4700::1111") == 0);
CHECK(sfIpAddress_toInteger(address) == 0);
uint8_t result[16] = {};
CHECK(sfIpAddress_toV6Bytes(address, result));
CHECK(std::memcmp(bytes, result, sizeof(bytes)) == 0);
CHECK(!sfIpAddress_toV6Bytes(sfIpAddress_LocalHostV4, result));
}
SECTION("sfIpAddress_fromBytes")