client IP auslesen
-
Hi,
@MFK
rumgespielt meint "try and error". Habe einfach alles mögliche (cli_addr. ...) in inet_ntoa() geworfen und geschaut was dabei rauskommt. Allerdings gabs entweder Fehler oder es wurde ein "int" zurückgegeben.
Ich hab natürlich bereits geschaut wie die Strukturen aussehen, aus denen ich da die Information ziehen möchte.Allerdings blick ich da nicht ganz durch, in der Struktur gibts dann ne Struktur, mit nem Zeiger auf n Array von Zeigern und noch mehr Strukturen...@gigg
danke für den Hinweisder für mich relevante Teil ist wohl folgender...
struct sockaddr_in *i; ... i = (struct sockaddr_in*)&ifa.ifr_addr; puts (inet_ntoa(i->sin_addr));
allerdings hilft mir das nicht weiter, da bei mir ja folgende Situation vorliegt...
struct sockaddr_in serv_addr, cli_addr;
Vermutlich gibts da ne ganz einfache Lösung, aber ich bin relativ neu in C und insbesondere Zeigern und Strukturen.
-
Hallo,
puts (inet_ntoa(cli_addr.sin_addr));
MfG,
Probe-Nutzer
-
puts (inet_ntoa(serv_addr.sin_addr)); puts (inet_ntoa(cli_addr.sin_addr));
foo->bar ist kurz für *(foo).bar
-
@Probe-Nutzer, Insider
naja soviel das foo->bar = (*foo).bar ist weiß ich dann doch.
leider ist mein cli_addr aber kein Zeiger, sondern nur eine Variable, weshalb
puts (inet_ntoa(cli_addr.sin_addr));
nicht funktioniert.
gcc sagt dazu folgendes...
$ gcc ./open_socket.c -lpthread -o ./open_socket ./open_socket.c: In Funktion »main«: ./open_socket.c:84:1: Warnung: Übergabe des Arguments 1 von »puts« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung [standardmäßig aktiviert] /usr/include/stdio.h:692:12: Anmerkung: »const char *« erwartet, aber Argument hat Typ »int«
-
Der Fehler, den gcc ausgibt, hat überhaupt nichts damit zu tun, dass cli_addr kein Zeiger ist. Zeige besser die Zeile 84, damit klar ist, was das Problem ist. Dort verwendest du offensichtlich nicht inet_ntoa (denn das gibt keine Ganzzahl zurück, wie gcc feststellt), sondern...?
MfG,
Probe-Nutzer
-
Zeile 84 ist
puts (inet_ntoa(cli_addr.sin_addr));
dachte das wäre aus meinem Post ersichtlich.
-
Ok, dann noch einmal ganz genau, warum ich anzweifeln musste, dass das die richtige Zeile ist (dein main oben hat z.B. auch nur 54 Zeilen) : die angegebene Zeile kann die Warnung (nicht Fehler, wie ich oben schrieb) nicht verursachen, weil inet_ntoa, wie nachzulesen ist, char* zurück gibt, und keine Ganzzahl, nicht die Übergabe von cli_addr.sin_addr an inet_ntoa ist das Problem, sondern das puts einen int bekommt, den inet_ntoa nicht als Ergebnis liefern kann. Hast du irgendwo noch etwas mit inet_ntoa stehen, hast du über main noch etwas, was das verursachen könnte?
MfG,
Probe-Nutzer
-
woanders im Programm wird weder inet_ntoa() noch puts benutzt, lediglich zum testen an folgender Stelle (für gesamten Codeausschnitt siehe Eröffnungspost)
... while (1) { bzero(command,255); //initialisiere command buffer listen(sockfd, 5); //int listen(int socket, int backlog) - backlog, something with the queue clilen = sizeof(cli_addr); //Länge der client addresse newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); -----> puts (inet_ntoa(cli_addr.sin_addr)); read(newsockfd,command,255); ...
-
Include vergessen?
-
sähe da die Meldung von gcc nicht anders aus?
hier die includes...#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <pthread.h>
-
P!ngu schrieb:
sähe da die Meldung von gcc nicht anders aus?
Ich bin nicht so der C-Fachmann, aber war das im alten Standard nicht so, dass undeklarierte Funktionen als Rückgabetyp int angenommen werden? Das würde zur Fehlermeldung passen
P!ngu schrieb:
hier die includes...
man inet_ntoa erwähnt noch
#include <arpa/inet.h>
-
damit funktionierts!
Vielen Dank MFK
hier nochmal kurz die Zusammenfassung...
Situation: Client hat sich bereits mit Server verbunden.
Frage: Wie bekomme ich auf Serverseite die IP vom Client als String?
Antwort: so...... #include <arpa/inet.h> ... int main(int argc, char *argv[]) { ... struct sockaddr_in serv_addr, cli_addr; ... while (1) { ... listen(sockfd, 5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); puts (inet_ntoa(cli_addr.sin_addr)); ...
Vielen Dank auch an alle anderen die mir hier geholfen haben.
Schönes Wochenende,
Pingu