client IP auslesen
-
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