PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : In C Programme nutzen



Rainbow-Warrior
04-02-2008, 19:04
Hallo zusammen,

ich möchte ein c-programm schreiben, welches nmblookup und ping verwendet. Da ich unter linux nicht ohne weiteres clients über den namen anpingen kann. Ein entsprechendes Bash-Skript war nicht das Problem. Aber nun möchte ich meine C Kenntnisse vorrantreiben indem ich das in C umsetzte. Leider stoße ich ziemlich früh an meine Grenzen:

Diesen Code habe ich im Internet gefunden, bekomme ihn aber nicht zum laufen.


#include <cstdlib>
#include <iostream>
#include <stdlib.h>

using namespace std;

void ping()
{
string ip;
int a,b,c,d;

cout << "ip eingeben" << endl;
cin >> ip;

cout << ip << endl;

system(("ping " + ip)->c_str());
}

int main(int argc, char *argv[])
{
ping();

system("PAUSE");
return EXIT_SUCCESS;
}


Das "using namespace std;" kenne ich noch aus meine "Microsoft Visual C++ - Zeit" noch. Ich habe auch in meiner neuen Lektüre ("C und Linux, Martin Gräfe") nichts darüber gelesen, brauch ich das überhaupt?

Wenn ich diesen Code kompilieren möchte, bekomme ich folgende Fehlermeldung:


gcc -Wall ping.o -o ping
ping.o: file not recognized: File format not recognized
collect2: ld returned 1 exit status


Ich habe schon einiges ausprobiert und gesucht, habe es aber nicht hinbekommen. Hoffe es mag mir jemand helfen.



Using built-in specs.
Target: i586-suse-linux
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.2.1 --enable-ssp --disable-libssp --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.2 --enable-version-specific-runtime-libs --without-system-libunwind --with-cpu=generic --host=i586-suse-linux
Thread model: posix
gcc version 4.2.1 (SUSE Linux)


Gruß Björn

jeebee
04-02-2008, 19:25
Der Code den du gepostet hast, ist auch nicht C, es ist C++ Code. Das siehst du z.B. an cin, cout, dem Keyword string sowie << und >> mit Strings.

So kurz in C:

#include <stdio.h>
#include <stdlib.h>

void ping(void) {
/* Variablendeklaration für die Strings,
* ein String in C ist einfach ein char-Array */
char ip[16], cmd[26];
/* Eingabe */
printf("IP eingeben: ");
/* User-Eingabe lesen */
fgets(ip, 16, stdin);
/* Kontrollausgabe */
printf("IP: %s\n", ip);
/* Befehlsstring zusammensetzen */
snprintf(cmd, 26, "ping -c 4 %s", ip);

/* ausführen */
system(cmd);
return;
}

int main(int argc, char *argv[]) {

ping();

return EXIT_SUCCESS;
}

Noch zum kompilieren: C-Sourcecode hat normalerweise den Suffix .c, also:
gcc -Wall -o ping ping.c

HTH
jeebee

PS: Der Code macht keine Input-Überprüfung, es werden einfach die ersten 16 Zeichen gelesen die der User eingibt und dann wird diese Zeichenkette ungeprüft an ping weitergegeben.

Rainbow-Warrior
04-02-2008, 19:53
Oh..okay vielen Dank!!

Gibt es eine zentrale Page, wo man Funktionen verschiedener Libs einsehen kann? In php wäre das z.B. dass php3.de/manual/. Ich glaube das würde mir sehr weiterhelfen, da ich wie gewohnt im vi schreibe.

Wie muss ich die Variable definieren, wenn die Anzahl der Zeichen vorher nicht bekannt ist?

Gruß Björn

jeebee
04-02-2008, 20:20
man-pages für Systemfunktionen wie IO/Signal etc. Eine zentrale Page für alles was es an C-Libraries gibt, wäre sehr warscheinlich unglaublich gross.

Zur String-Geschichte:
1) Glib (http://library.gnome.org/devel/glib/2.14/) nutzen, dann hast du GString zur Verfügung.
2) mit malloc() und realloc() selbst einen String bauen der sich selbst vergrössert (aufwendig, nicht unbedingt ein Anfängerprojekt, wenns auch sicher sein soll (Stichwort: Buffer overflow)).

Bsp. mit GLib:

GString *str;
str = g_string_new("ping -c 4 ");
g_string_append_printf(str, "%s", ip);
/* um dann das char-Array zu erhalten: */
char *cmd = str->str;
system(cmd);


Eingabe direkt in einen GString parsen habe ich gerade nichts gefunden.

Rainbow-Warrior
04-02-2008, 20:40
Okay..nochmals vielen Dank!

Aber das heißt doch das ich das Programm, wenn es mal fertig sein sollte, nicht so einfach auf anderen Systemen laufen lassen kann, da diese lib fehlt. Naja okay, andere Programme setzen auch libs vorraus.



nicht unbedingt ein Anfängerprojekt

Ich glaube bisher kenne ich nur ein Projekt welches für mich als Anfänger in C geeignet ist und dass ist "Hello world". Aber ich hab nicht vor jetzt schon aufzugeben. Wobei ich sagen muss, dass ich perl,php,c#,bash und sogar c++ schneller gelernt habe als C. Es ist irgendwie "ein Schritt zurück" quasi "back to roots, from another guy". Naja ich denke aber es lohnt sich, um einige Programme besser zu verstehen...etc.

P.S.: Spätestens wenn ich mein Programm fertiggestellt habe, meld ich mich nochmal.

Wünsche eine schöne Woche!

Björn

jeebee
04-02-2008, 20:49
Also mit GLib bist du sicher unter Windows und Linux/Unix ok dran. Da gibts nämlich sicher Versionen.