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.