Online IP auslesen?
-
#include <windows.h> #include <iostream> #include <string> #include <wininet.h> class WinInet { public: WinInet(const std::basic_string<TCHAR>& agent, DWORD accessType) { handle_ = InternetOpen(agent.c_str(), accessType, NULL, NULL, 0); if(handle_ == NULL) { throw std::exception("InternetOpen failed!"); } } ~WinInet() { InternetCloseHandle(handle_); } HINTERNET getHandle() const { return handle_; } private: HINTERNET handle_; }; class WinInetResource { public: WinInetResource(const WinInet& winInet, const std::basic_string<TCHAR>& url, DWORD flags = 0) { handle_ = InternetOpenUrl(winInet.getHandle(), url.c_str(), NULL, 0, flags, NULL); if(handle_ == NULL) { throw std::exception("InternetOpenUrl failed!"); } } ~WinInetResource() { InternetCloseHandle(handle_); } DWORD read(char* buffer, DWORD numberOfBytesToRead) { DWORD numberOfBytesRead; BOOL result = InternetReadFile(handle_, buffer, numberOfBytesToRead, &numberOfBytesRead); if(result == 0) { throw std::exception("InternetReadFile failed!"); } return numberOfBytesRead; } private: HINTERNET handle_; }; std::string downloadInternetResource(const std::basic_string<TCHAR>& url) { WinInet winInet(TEXT(""), INTERNET_OPEN_TYPE_PRECONFIG); WinInetResource winInetResource(winInet, url); std::string data; for(;;) { char buffer[4096]; DWORD numberOfBytesRead = winInetResource.read(buffer, sizeof(buffer)); if(numberOfBytesRead == 0) { break; } data.append(buffer, numberOfBytesRead); } return data; } bool getWanIpAddress(std::string& wanIpAddress) { std::string pageContent; try { pageContent = downloadInternetResource(TEXT("http://checkip.dyndns.org")); } catch(const std::exception& exception) { std::cout << exception.what() << "\n"; return false; } std::string stringBeforeIpAddress = "Current IP Address: "; std::string stringAfterIpAddress = "</body></html>"; std::string::size_type positionOfStringBeforeIpAddress = pageContent.find(stringBeforeIpAddress); if(positionOfStringBeforeIpAddress != std::string::npos) { std::string::size_type startPosition = positionOfStringBeforeIpAddress + stringBeforeIpAddress.length(); std::string::size_type endPosition = pageContent.find(stringAfterIpAddress, startPosition); if(endPosition != std::string::npos) { wanIpAddress = pageContent.substr(startPosition, endPosition - startPosition); return true; } } return false; }; int main() { std::string wanIpAddress; if(getWanIpAddress(wanIpAddress)) { std::cout << wanIpAddress << "\n"; } else { std::cout << "Fehler beim Ermitteln der IP-Adresse.\n"; } }
-
hehe schrieb:
Ich bin grade mir dabei einen Chat zu bauen.
Der Chat soll nicht nur in einem Netzwerk laufen.
Jetzt wollte ich wissen ob ich dafür die Lokale oder die Online IP vom Server brauche.Die Frage ist, wofür? Wenn du über das Internet mit einem Server verbinden willst, musst du die IP nehmen, über die der Server im Internet erreichbar ist.
hehe schrieb:
Und wie kann man die Online IP auslesen lassen?
Normalerweise sollte das über Sockets kein problem darstellen. Wenn du eine Verbindung zu einem PC im Internet hast, einfach abfragen, von welcher IP deine Abfrage kam.
-
ich würde STUN bemühen. wirst du auch wegen firewalls etc. nicht drum herum kommen. kommt natürlich auch darauf an was du vor hast.
-
@ frickler:
Ich programmiere aber in C net C++.
-
Kann mir jemand den Code von frickler für C umschreiben?
-
Ja, ne ist klar
-
Da hier ein schöner funktionierender Code steht, währe das doch was für die FAQ
-
Ich täte aber nicht unbedingt checkip.dyndns.org nehmen. Die URL haben die dyndns-Leute eigentlich nur für die Update-Clients gebastelt und wer weiss ob die das nicht irgendwann einstellen oder den Zugang nicht mehr öffentlich anbieten.
Obwohl checkip.dyndns.org von etlichen Leuten so genutzt wird, würde ich da zumindest vorher fragen statt einfach nutzen
...oder die IP von nem eigenen Script organisieren....und man sollte auch nicht zu oft checken:
dyndns-faq schrieb:
We ask that you not check against this page more than once every 10 minutes. Anyone hitting it more frequently than that is liable to become blocked from using the checkip service. We provide no guarantees regarding the checkip service, and it should be used at your own risk.
-
56€ die Stunde.
-
http://winapi.net/forum/viewtopic.php?t=521&start=0
bei der Funktion (ShowIP_Internet) musste aber glaub ich diese dwCode if-Abfrage rausnehmen oder ändern damit es funktioniert.