IP herausbekommen
-
Und "accept" liefert dir direkt die IP-Adresse...
-
Jochen Kalmbach schrieb:
Und "accept" liefert dir direkt die IP-Adresse...
Stimmt doch gar nicht. Das liefert nur die SOCKADDR Struktur.
-
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...
-
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...