Online IP auslesen?
-
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.
Und wie kann man die Online IP auslesen lassen?
-
Wie bitte
-
Du brauchst die online IP des Servers. Deine Online IP findest du auf
http://www.wieistmeineip.de/ heraus. Da sich aber bei "normalen Verbrauchern" die IP Adresse regelmäßig ändert bräuchtest müsstest du dich noch bei
http://www.dyndns.com/ registrieren. DynDns ist ein (kostenloser) Service, der dir eine gleichbleibende IP bietet. Wenn dein Computer hinter einem Router steht musst du zusätzlich noch die Port Forewarding Einstellungen verändern, sodass der Router weiss an welchen PC er dir Anfrage nach Daten weiterleiten soll. Ich hoffe, dass ich dich jetzt nicht noch meht verwirrt habe.
Eine einfachere Lösung wäre es mal nach Hamachi zu googeln.(Wenn ich irgendwas falsches geschrieben habe, so korrigiert mich bitte)
-
fürs internet brauchst du natürlich die InternetIP
Da, aber viele Leute einen Router benutzen, müsstest du dir die IP über eine Internet Seite hohlen. (gibt ja genug die die dir anzeigen)
Benutzt du ein DSL Modem dann kannste die auch per Winsock auslesen.Und schau mal in die FAQ
//Edit zu spät
-
#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.