IP herausbekommen
-
Also ich hab mir mal ein kleines Serverprogramm geschrieben. Dieses gibt immer die Zeile "Incomming Connection... Connection accepted" aus, wenn eine eingehende Verbindung akzeptiert wurde. Gibt es jetzt auch eine Möglichkeit, die IP der eingehenden Verbindung herauszufinden?
Schonmal Thx, im Voraus.
-
getpeername
-
Ja, die Funktion ist ja schön und gut, aber wie krieg ich nun die IP raus? Also in dem SOCKADDR ist die irgendwie nicht abgelegt.
-
Prinzipiell gibt ja "accept" die adresse zurück (2. Parameter).
Aber auf den Soket kannst DU ja auch jederzeit "getpeername" aufrufenn um die Adresse zu bekommen...
Oder was ist Dein Problem?
-
Den Socket hab ich ja, ich will jetzt aber die IP-Adresse desjenigen rausbekommen, der eine Verbindung zu dem Server-Programm aufbaut.
-
mit getnameinfo kannst du dann die ip bekommen.
-
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();