Mit C den Default Gateway herausfinden

Morfio

Well-Known Member
Hi,

da ich im Internet rein gar nichts dazu finde: kennt jemand eine Möglichkeit, den/die Default Gateway(s) herauszufinden, und das via C und kann mir einen Hinweis geben?

Viele Grüße, Morfio
 
ich habe es noch nie gemacht, aber schau doch mal in net/route.h
wenn du schreibst fuer welches betriebssystem du das machen willst, können andere dir vllt auch besser helfen :)

edit:
auf das bin ich gerade gestossen:
http://sourceware.org/ml/ecos-discuss/2001-10/msg00589.html

Das sieht schonmal gut aus, danke. Aber leider lässt es sich nicht linken:

PHP:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <resolv.h>
#include <net/route.h>

extern struct rtentry *rtalloc1(struct sockaddr *dst, int report);

unsigned long myIpGate(void)
{
  struct rtentry *rt;
  struct sockaddr dst;
  
  memset(&dst,0,sizeof dst);
  dst.sa_family = PF_INET;
  
  rt = rtalloc1(&dst,0);

  if (rt && rt->rt_gateway)
    return ((struct sockaddr_in*)(rt->rt_gateway))->sin_addr.s_addr;
  else
    return 0;
}

int main() {
	//printf("%s\n", inet_ntoa(((struct sockaddr_in *) myIpGate());
}

Da kommt folgendes raus:

[thorsten@thorsten ~/Desktop]$ gcc test.c
/var/tmp//ccuEAIyB.o(.text+0x34): In function `myIpGate':
: undefined reference to `rtalloc1'

Ich habe jetzt etliches an Libs durch und finde nichts, was man für rtalloc1 linken muss ...
 
Gar nichts. rtalloc1(9) ist Teil des Kernelinterfaces und wird nicht ins Userland exportiert. Kurz um, man nutzt es um Kerneltreiber zu schreiben. :)
 
Es mag eine unzureichende Antwort sein, um Dein Problem direkt zu lösen, aber in TCP/IP Illustrated Vol.2 habe ich sehr viele Seiten gefunden, die dir weiterhelfen könnten. Möglicherweise lässt sich das mit einem ioctl hinbekommen, das alles aus dem Buch jetzt aber abzutippen, ist ein wenig heftig und sicher auch rechtlich nicht einwandfrei.

Abgesehen davon, dass ich Dir das Buch wärmstens empfehlen kann, schreib mir doch ne PM - dann sehen wir weiter ;)

Herakles
 
hey,
wieso per PM? Mich interessiert das jetzt auch ;) Und vllt. kommt noch jemand per google hierher und findet dann auch keine Lösung.
 
Du könntest doch auch /etc/rc.conf nach defaultgateway durchschauen lassen und entsprechend ausgeben. Oder sollte mich mein müdes Hirn dem Schwachsinn zuführen?

Viele Grüße
swaf
 
In netstat werden die Routing Tabellen per kvm_read() ausgelesen. Aber vielleicht gehts auch einfacher..
 
Es mag eine unzureichende Antwort sein, um Dein Problem direkt zu lösen, aber in TCP/IP Illustrated Vol.2 habe ich sehr viele Seiten gefunden, die dir weiterhelfen könnten. Möglicherweise lässt sich das mit einem ioctl hinbekommen, das alles aus dem Buch jetzt aber abzutippen, ist ein wenig heftig und sicher auch rechtlich nicht einwandfrei.

Abgesehen davon, dass ich Dir das Buch wärmstens empfehlen kann, schreib mir doch ne PM - dann sehen wir weiter ;)

Herakles

Wäre schön, wenn du mir einfach nur einen Hinweis, also eine Art Stichwort, geben könntest (-: ... für das kleine Problem das Buch jetzt anzuschaffen möchte ich nicht wirklich.

Du könntest doch auch /etc/rc.conf nach defaultgateway durchschauen lassen und entsprechend ausgeben. Oder sollte mich mein müdes Hirn dem Schwachsinn zuführen?

Jain, das ist schon eine Lösung, aber recht dreckig, weil defaultgateway nicht wirklich der "Default Gateway" sein muss. Man kann den ja via "route" abändern.

hey,
wieso per PM? Mich interessiert das jetzt auch Und vllt. kommt noch jemand per google hierher und findet dann auch keine Lösung.

Fände ich auch besser, hier öffentlich zu machen.

In netstat werden die Routing Tabellen per kvm_read() ausgelesen. Aber vielleicht gehts auch einfacher..

Danke, sehe ich mir die Tage mal an.
 
popen ...; fork...;
/* in child */ close..., dup..., exec("route get -n default")...
/* in parent */ wait..., read..., sscanf...
 
Moin Morfio,

Hi,

da ich im Internet rein gar nichts dazu finde: kennt jemand eine Möglichkeit, den/die Default Gateway(s) herauszufinden, und das via C und kann mir einen Hinweis geben?

Viele Grüße, Morfio

Schau Dir doch mal den Quelltext zu netstat an (/usr/src/usr.bin/netstat/route.c). Die Funktion static void p_rtentry(struct rtentry *rt) {...} erzeugt die Ausgabe der Routen und Flags. Verfolge mal, welche anderen Funktionen in dieser aufgerufen werden.
Leider ist es so, dass Du die Defaultroute nicht direkt erfragen kannst. Du musst in einer Schleife alle Einträge der Routing-Tabelle durchgehen und nach dem Flag RTF_GATEWAY abfragen.

Ich hoffe, dass es ein Denkanstoß ist.

JueDan
 
Morfio,

ich würde Dir echt gerne helfen, glaube aber da rechtlich in Graubereiche zu kommen, wenn ich hier Texte aus dem Buch abscanne. Und Dein Wunsch "wenigstens einen Tipp" zu geben, beinhaltet, dass ich das Buch auf links ziehe und die entsprechenden Teile abtippe. Das möchte ich nicht öffentlich tun, deshalb setze ich das nicht hier ins Forum. Versteh das bitte!

Ich bin aber überzeugt, dass juedans Ansatz weiterhelfen kann. In bekanntem, offenem Code zu wühlen ist immer eine gute Idee und rechtlich ja auch einwandfrei :)

Wie gesagt, es bleibt immer noch die Möglichkeit der PM (und nein, ich will Dir das Buch nicht verkaufen! ;) )

Herakles
 
Zurück
Oben