C: Segmentation Fault beim Server-Connect

HentaiD

Mitglied
Hallo Freunde,
ich habe ein Problem bei einer C-Funktion, die zum Server verbinden soll. Debugger spuckt nichts aus, aber beim ausführen des Programms erwartet mich ein Segmentation Fault, ich frage mich aber wieso.

Das ganze wird unter Linux ausgeführt.

So sieht meine Funktion aus:

Code:
// Baue Verbindung zu Server auf:
Server_connect(){

// definiert in <netinet/in.h>
// Struktur beinhaltet IP/Port, standardmaessig: server_addr.sin_family = AF_INET
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(IP);
server_addr.sin_port = htons(PORT);

// Socket anlegen
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Hier mal pruefen, ob alles ok ist beim Socket
if (sockfd < 0){
error("ERROR beim Oeffnen des Sockets");
}

// Jetzt versuchen zu verbinden
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
error("ERROR beim Verbinden zum Server");
}

printf("Zum Server verbunden\n");

return 0;
}

Wäre super, wenn mir da jemand helfen kann.

Greetz,HD
 
Hi!
Der GDB gibt mir das hier aus:

(gdb) run x11
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/x11 x11
/root/x11:
Program received signal SIGSEGV, Segmentation fault.
0xb7eaf823 in strchrnul () from /lib/i686/cmov/libc.so.6
(gdb) where
#0 0xb7eaf823 in strchrnul () from /lib/i686/cmov/libc.so.6
#1 0xb7e766db in vfprintf () from /lib/i686/cmov/libc.so.6
#2 0xb7e7af90 in **** () from /lib/i686/cmov/libc.so.6
#3 0xb7e768fe in vfprintf () from /lib/i686/cmov/libc.so.6
#4 0xb7f1671b in **** () from /lib/i686/cmov/libc.so.6
#5 0xb7f16979 in error () from /lib/i686/cmov/libc.so.6
#6 0x0804857b in Server_connect () at x11.c:38
#7 0x080485a4 in main () at x11.c:49

Kann damit nicht so recht was anfangen.

Zeile 38 ist:
error("ERROR beim Verbinden zum Server");

Zeile 49 ist:
Server_connect(); // Ueber Funktion verbinden

in der main-Funktion

Greetz,HD
 
Ersetze
C++:
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
    error("ERROR beim Verbinden zum Server");
}
durch
C++:
{
    int i;
    i=connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (i < 0)
    {
        printf("ERROR %d beim Verbinden zum Server", i);
        return 1;
    }
}

und sorg beim Aufruf von Server_connect im main dafür, dass das Programm beendet wird, wenn die Funktion was anderes als 0 zurückgibt.

Die neue Ausgabe bitte dann reinstellen.
 
Tatsache, das funktioniert 1A. Danke sehr.
Habe die Errorfunktion wohl falsch angegeben. Was für eine Ausgabe, soll ich den reinstellen? =)

Greetz,HD
 
"Es funktioniert" bedeutet, das es zu keinem Absturz mehr kommt, aber trotzdem eine Fehlermeldung auftaucht, oder?
Und von dieser Meldung hätte ich gern die Nummer hinter dem ERROR.
 
Hi.

Kann es sein, das du die error Funktion gar nicht definiert hast?

Kann es sein, das du (wenn alle Compilerwarnungen einschaltest) eine Warnungsmeldung vom Compiler bekommst?

Es gibt eine error Funktion in der GNU libc, die erfordert aber mind. 3 Argumente...

\edit: evtl. wolltest du die perror Funktion verwenden, die gibt auch den Grund für den Fehler mit aus.

Gruß
 
Zuletzt bearbeitet:
Zum lesen des stack traces:

#0 0xb7eaf823 in strchrnul () from /lib/i686/cmov/libc.so.6
#1 0xb7e766db in vfprintf () from /lib/i686/cmov/libc.so.6
#2 0xb7e7af90 in **** () from /lib/i686/cmov/libc.so.6
#3 0xb7e768fe in vfprintf () from /lib/i686/cmov/libc.so.6
#4 0xb7f1671b in **** () from /lib/i686/cmov/libc.so.6
#5 0xb7f16979 in error () from /lib/i686/cmov/libc.so.6
#6 0x0804857b in Server_connect () at x11.c:38
#7 0x080485a4 in main () at x11.c:49

Nun dein stack trace verläuft sich in irgendwelche vfprintf aufrufe. nach einem error() aufruf in die libc.

aus der manpage von error() wissen wir:
Code:
void error(int status, int errnum, const char *format, ...);
error ist eine vararg funktion -> crasht weil du zu wenig parameter übergeben hast.

error müsste demzufolge so aufgerufen werden:

Code:
error(0, 0, "fehlermeldung");
 
Zuletzt bearbeitet:
Zurück