IP in String
-
Hallo!
Ich spiele gerade etwas mit Netzwerkzeug (im speziellen UDP) rum ;). Nun komme ich an eine Stelle, an der ich Daten empfange und herausfinden will, von wem die sind:recvfrom(mSock, response, 1024, 0, (SOCKADDR*)&mAddrResponse, &mAddrResponseLen); cout<<mAddrResponse.sin_addr.s_addr<<endl;
Schön, kein Problem, aber wie wandle ich nun die als unsigned_long gegebene IP-Adresse in einen String der gewohnten Form (X.X.X.X) um?
-
Möglichkeit 1: Die in_addr ist (laut) MSDN eine union aus 4 char's (S_un_b.s_b1 bis S_un_b.s_b4), 2 short (S_un_w.s_w1 und S_un_w.s_w2) oder einem long (S_addr) - du kannst erster nehmen, um die vier Blöcke der IP auszulesen.
Möglichkeit 2: Du verwendest Bit-Shift's und Bit-And, um deinen long-Wert zu zerlegen.
-
Möglichkeit 3:
typedef unsigned long uint32; std::string ip_to_string(uint32 ip) { std::ostringstream strm; unsigned char *bytes = reinterpret_cast<unsigned char *>(&ip); strm << static_cast<uint32>(bytes[0]) << "." << static_cast<uint32>(bytes[1]) << "." << static_cast<uint32>(bytes[2]) << "." << static_cast<uint32>(bytes[3]); return strm.str(); }
-
Möglichkeit 4:
Man nehme einfach die dafür gedachten BSD-Socket-Funktionen:cout << inet_ntoa(mAddrResponse.sin_addr) << endl;
-
Guck dir mal diese Funktionen an:
http://www.zotteljedi.de/doc/socket-tipps/inet_xxx.html
Sollte genau das sein was du suchst. Zu beachten ist das es inet_ntoa nur in UNIX-Systemen gibt. Für Windows ist inet_addr zu verwenden.Greetz
-
Vellas schrieb:
Zu beachten ist das es inet_ntoa nur in UNIX-Systemen gibt. Für Windows ist inet_addr zu verwenden.
EDIT: Revision!
Laut MSDN 8.0 ist inet_ntoa sehr wohl in Winsock 2 vorhanden.
-
inet_ntoa(mAddrResponse.sin_addr);
Sehr schön, das gefällt mir ;). Danke!
-
LordJaxom schrieb:
Vellas schrieb:
Zu beachten ist das es inet_ntoa nur in UNIX-Systemen gibt. Für Windows ist inet_addr zu verwenden.
EDIT: Revision!
Laut MSDN 8.0 ist inet_ntoa sehr wohl in Winsock 2 vorhanden.
War auch völliger Blödsinn, es war inet_aton() die es bei MS nicht gibt. Aber ne MSDN-Suche hat dazu bissl was ausgespuckt. U.a. nen Source zu inet_aton():
http://research.microsoft.com/invisible/src/net/wsock32/inet_add.c.htm
Folgender Link ist auch sehr interessant (dort ist u.a. auch inet_aton zu finden):
http://technet2.microsoft.com/WindowsServer/en/library/5309e1bf-0316-4db3-b1e7-d62db16813041033.mspx?mfr=true
MSDN: http://search.microsoft.com/results.aspx?mkt=en-GB&setlang=en-GB&q=inet_atonGreetz