Potrzebowałem funkcji sprawdzającej, czy podany adres jest adresem z nazwą, czy adresem IP. Wiele nie myśląc napisałem:

bool Cu3Networking::isIPAddress(QString address)
{
    struct sockaddr_in sa;
    int result = inet_pton(AF_INET, address.toStdString().c_str(), &(sa.sin_addr));
    return result != 0;
}

I wszystko fajnie, dopóki mnie user nie sprowadził na ziemię tekstem: “twój program nie uruchamia się na Windows XP!”. No tak… wciąż musimy zmagać się z systemem, który ma już ponad 10 lat na karku. Paranoja…

bool Cu3Networking::isIPAddress(QString address)
{
#ifdef WINXP_SUPPORT
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (0 != result)
    {
        qDebug() << "WSAStartup failed: " << result;
        return false;
    }
    result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (0 != result)
    {
        qDebug() << "WSAStartup failed: " << result;
        return false;
    }
    unsigned long ulAddr = INADDR_NONE;
    ulAddr = inet_addr(address.toStdString().c_str());
    if (INADDR_NONE == ulAddr)
    {
        qDebug() << "inet_addr failed and returned INADDR_NONE";
        WSACleanup();
        return false;
    }
    if (INADDR_ANY == ulAddr)
    {
        qDebug() << "inet_addr failed and returned INADDR_ANY";
        WSACleanup();
        return false;
    }
    result = 1;
    WSACleanup();
#else
    struct sockaddr_in sa;
    int result = inet_pton(AF_INET, address.toStdString().c_str(), &(sa.sin_addr));
#endif
    return result != 0;
}

No i teraz działa. Pamiętać tylko należy o zdefiniowaniu flagi WINXP_SUPPORT.