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.