IP herausbekommen
-
Die SOCKADDR enthält bei mir char sa_data[14] und u_short sa_family, soweit ich weißt ist die IP aber in SOCKADDR_IN und ich weiß NICHT wie man aus der addr.sin_addr.s_addr eine IP machen soll(umgekehrt schon).
-
Wer nicht in der Lage ist aus einer "sockaddr" eine "lesbare" IP zu machen, sollte mit dem Programmieren aufhören...
-
Ich hab vor 3h mit dem Thema Internet-Programmierung begonnen, muss man da wohl schon wissen wie man daraus eine IP macht?!
-
Der Kommentar war nicht auf Dich bezogen... sondern auf die Behauptung, dass "accept" die Adresse nicht zurückliefert...
Das Beispiel zur Umwandlung von sockaddr in einen String ist aber hier drin:
http://msdn.microsoft.com/library/en-us/winsock/winsock/sockaddr_2.asp
(inet_ntoa)
-
Ja, accept liefert ja auch nicht die IP zurück sondern kann als 2 Parameter einen Pointer auf eine SOCKADDR entgegennehmen. Die IP steht aber nicht in SOCKKADDR sondern in SOCKADDR_IN!
Und dann weiß ich immernoch nicht wie ich aus saddr.sin_addr.s_addr die IP mache!
-
Das steht doch in dem Beispiel!!!!!!!!
-
sockaddr ist die "oberklasse" für jede Art von Adressen (es gibt ja nicht nur IP!). Um welche es sich handelt steht ja dann in "sin_family" drin! Daraufhin kann man dan entsprechend auf den anderen Typ casten...
Also, wenn sin_family ein "AF_INET" ist, dann kannst Du es getroste in sockaddr_in casten...
-
Juhu! Ich habs kapiert! Nur eins noch: wenn ich inet_ntoa benutze um die Adresse in die IP umzuwandeln, krieg ich immer als IP: 88.255.34.0. Mehrere Leute haben schon auf den Server zugegriffen und dann kommt immer diese IP bei mir.
-
Dann hast du einen Fehler in deinem Code.
-
Nur ein Teilauszug:
// Wait for incomming connections bool SOCKET_Server::run() { if(listen(acceptSocket, 100) == SOCKET_ERROR) { printf("Not enough rights to act as a server!\n"); return false; } printf("Waiting for incomming connections...\n"); while(true) { in_addr saddr; connectedSocket = accept(acceptSocket, (SOCKADDR *) &saddr, NULL); printf("Incomming Connection..."); if(connectedSocket == INVALID_SOCKET) { printf(" Could not accept the incomming connection!\n"); continue; } printf(" Connection accepted. "); char *IP = inet_ntoa(saddr); printf("(%s)\n", IP); closesocket(connectedSocket); } return true; }Jetz greif ich auf mich selbst zu und dann müsste kommen:
Incomming connection... Connection accepted. (89.57.10.171)Dort kommt aber jetzt(schon wieder anders als vorhin:
Incomming connection... Connection accepted. (192.253.34.0)
-
Dann musst Du doch mal "getpeername" probieren...
Vermutlich liege ich doch falsch und man muss explizit "getpeername" aufrufen... falls dies so ist, möchte ich mich entschuldigen...
-
Also bei getpeername kommt das selbe raus. Wenn ich das ganze jetzt aber mit OpenWatcom statt mit Dev-C++ kompiliere kommt da nicht mehr die IP von vorhin, sondern: 81.0.0.0. Und ich denke mir die 81 soll hier die Portnummer sein:
// Start Winsocket 2.0, create the socket and bind it to a port bool SOCKET_Server::start(int portnumber) { // Start Winsocket 2.0 WSAStartup(MAKEWORD(2, 0), &wsa); printf("Winsocket 2.0 startet...\n"); // Create the socket for accepting connections acceptSocket = socket(AF_INET, SOCK_STREAM, 0); if(acceptSocket == INVALID_SOCKET) return false; printf("Socket for incomming connections created...\n"); // Bind the socket to a port memset(&addr, 0, sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(portnumber); addr.sin_addr.s_addr = ADDR_ANY; if(bind(acceptSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) return false; printf("Socket binded to port: %d\n", portnumber); return true; } ... // Try to start the server on port 81 server.start(81); server.run();
-
Du solltest auch den passenden Datentyp nehmen!!!
ALso bitte kein in_addr sondern ein sockaddr oder aockaddr_in!!!
-
Wenn ich als Datentyp sockaddr nehme, nimmt inet_ntoa den wieder nicht an und casten kann man das auch nicht. Und wenn ich sockaddr_in nehme und bei inet_ntoa saddr.sin_addr lässt sich das ganze zwar kompilieren, aber da steht wieder eine IP, die nicht stimmt.
-
Du solltest für "accept" ein "sockaddr_in" nehmen und für "inet_ntoa" den member "sin_addr" aus dem "sockaddr_in"...
-
Wenn ich das so mache, kommt immernoch eine falsche IP. Kann es daran liegen, dass ich hinter einem Router bin?
Also der Port den in benutze(81) ist freigegeben.
-
Nein, der Router dürfte damit nichts zu tun haben... es ist ja eine eingehende Verbindung und keine Ausgehende...
-
192.253.34.0 sieht mir nach deiner LAN ip aus. Wenn du zB hinter einem router sitzt und auf dich selbst zugreifst macht er einfach einen loopback ohne vorher über den router deine WAN ip anzunehmen.
zugeben hab nicht alles hier gelesen wenns nicht passt ignorier mich einfach

mfg ch
-
Also, das ist auch nicht meine LAN-IP. Und die IP ändert sich jedes mal wenn ich neu kompiliere.
-
Jochen Kalmbach schrieb:
Hmmm.... und was enthält die "struct sockaddr"?
http://msdn.microsoft.com/library/en-us/winsock/winsock/accept_2.asp
http://msdn.microsoft.com/library/en-us/winsock/winsock/sockaddr_2.aspPS: Wer nicht in der Lage ist aus einer "sockaddr" eine "lesbare" IP zu machen, sollte mit dem Programmieren aufhören...
Tönst ja auch immer ganz schön rum....bist bestimmt schon Millionär...