tuxdns für Fritz.Box - Netzwerkfehler

Homar

Neuer User
Mitglied seit
23 Jul 2005
Beiträge
58
Punkte für Reaktionen
0
Punkte
0
Hi,

brauche eure Hilfe.

Wenn ich tuxdns für die Fritzbox kompiliere, erhalte ich an der folgenden Stelle eine Fehlermeldung: "Network is unreachable"
dprintf("connect error:%s", strerror(errno));


Code:
	struct sockaddr_in saddr;
	int s = 0,len;

	if (!host_ip)
		return NULL;
	if((s = socket(AF_INET, SOCK_STREAM, 0))<0)
		return NULL;

	memset(&saddr, 0, sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(port);
	saddr.sin_addr.s_addr = inet_addr(host_ip);

	if (connect (s,(struct sockaddr*)&saddr, sizeof(saddr)) <0)
	{
		dprintf("connect error:%s", strerror(errno));
		return NULL;
	}

[tuxdns] connect error:Network is unreachable

Ich sehe leider keinen Fehler und auf arm oder ppc klappt es, wie es soll.

Muss man auf der Fritzbox noch was anderes machen, oder warum kriege ich keinen Connect.

Hoffe die Experten lesen mit.

MFG Homar
 
Du kannst doch Programmieren, warum verstehst du nicht was ich gepostet habe?

Ich kriege einen Socket, befülle die Struktur und kann die Verbindung nicht aufbauen.
Aber das ist eigentlich zu sehen.

Nun ist das schon deine 2. belanglose Antwort.

Wenn du nicht verstehst wonach ich Frage, warum tust du dann so als ob du mir helfen könntest ?

Lieber Antwort-Tausender, nichts für ungut...
 
Zuletzt bearbeitet:
Ich verstehe ganz genau, was Du geschrieben hast. Aber Du verstehst nicht, warum Deine Informationen unzureichend sind.
Das Programm ist offensichtlich in Ordnung, weil es auf anderen Rechnern funktioniert.

Das Programm versucht einen connect mit einer bestimmten IP-Adresse und Port. Darauf kommt die Meldung "Network is unreachable". Die Frage ist also, welches Netzwerk? Und wie ist die Netzwerk-Konfiguration der Box? Sollte dieses Netzwerk erreichbar sein?
Du könntest einerseits strace auf das Programm laufen lassen und andererseits mit tcpdump feststellen, was auf dem Netzwerk passiert.
 
Na das war doch eine sympatische antwort, verzeih' mein forsches Auftreten...

- auf der Fritz.Box ist alles korrekt eingerichtet
- ein Ping auf der Fritzbox auf die Domain wird korrekt aufgelöst und angepingt
- wenn ich aber tuxdns starte bekomme ich die besagte Meldung

...also müsste funzen und tut es aber nicht!

Beim kompilieren gab es keine Fehler und keine Warnings.

Inzwischen habe ich mir einige Sourcen für Mipsel angeschaut und dort ist nichts anderes als in meinem Programm.

tuxdns wurde auf der Freetz-Umgebung mit gcc kompiliert... bin jedenfalls am Ende mit meinem Latein

Nachtrag:
Auf der Fritz sind ja mehrere Netzwerkschnittstellen...

Muss ich auswählen, über welche Schnittstelle die Anfrage gehen soll und wie wählt mann aus, das es die Anfrage über das inet schicken soll.
Vielleicht spricht es die eth0 an und im lokalen Netzwerk kann es die Adresse nicht auflösen ?!?


MFG
Homar
 
Zuletzt bearbeitet:
Wie Ralf schon schrieb: Ruf doch mal dein Programm mit strace auf.

MfG Oliver
 
mache ich heute abend...

ich werde mal bind mit einbauen...

thx
 
Fehler gefunden:

gethostbyname() liefert negative Werte auf der Fritz.Box...
und zwar NUR auf der Fritz.Box

Das Ergebnis muss man anschließend durch inet_ntoa erneut umwandeln lassen.

Auf einem Progger-Portal wurde genau dieser Zustand angesprochen.


Jedenfalls ist die Tuxdns fertig für den Einsatz :)


MFG
Homar
 
naja, negativ halt...

gethostbyname("tuxdns.info") liefert auf arm und ppc-Platformen 85.214.134.219

In der Fritz wird daraus z.B. 85.-47.134.-8

erst durch inet_ntoa(gethostbyname("tuxdns.info")->h_addr_list) erhalte ich die richtige ip

Die Syntax habe ich gerade vereinfacht dargestellt, damit das verständlicher sein soll.

Wenn bedarf besteht, poste ich morgen den Auszug aus meiner Source

MFG
Homar
 
Die Syntax habe ich gerade vereinfacht dargestellt, damit das verständlicher sein soll.

Normalerweise ist es verständlicher, wenn man einen Sachverhalt exakt beschreibt, speziell wenn es um die Fehlersuche geht.

Da gethostbyname niemals die Adresse als String liefert, weiß ich auch nicht genau, was man von der Beschreibung halten soll. Und für den anfangs angesprochenen Connect braucht man keine Adresse in Form eines Strings.
 
Code:
char* getHostIP(const char* host, char* to)
{
	struct hostent* host_ent;
	if((host_ent = gethostbyname (host)) <=0)
	{
		printf("[tuxdns] !!! %s is not available !!!\n",host);
		return NULL;
	}
//	sprintf(to,"%d.%d.%d.%d",*host_ent->h_addr_list[0],*(host_ent->h_addr_list[0]+1),*(host_ent->h_addr_list[0]+2),*(host_ent->h_addr_list[0]+3));
	sprintf(to,"%s",inet_ntoa (*(struct in_addr *)*host_ent->h_addr_list));
	dprintf("host_ip: %s\n",to);
	return to;
}

OKeyyy, dann nocheinmal gaanz langsam ;-)

gethostbyname() löst die Domain auf und erstellt ein struct-gebilde vom Typ hostent auf dem Stack.
Die Anfangsadresse dessen liefert es als Antwort zurück, welches in einem Pointer gleichen Typs aufgefangen wird.
In diesem Gebilde gibt es einen Array h_addr_list, die die IP-Adresse der Domain haben sollte.
Dieser ist normalerweise von Typ unsigned int.
Da aber Teilsegmente der IP(v4) niemals Werte haben können die kleiner als 0 und grösser als 255 sind, übertrage ich es formatiert in den char-Array, auf dessen Anfangsadresse der Pointer "to" zeigt.

Normalerweise funktioniert es auch so auf verschiedenen Plattformen; nur nicht in der Fritzbox.

Teilelemente des Arrays h_addr_list wird in der Fritz mit Werten gefüllt, die so gross sind, das bei einer implizieten Umwandlung von unsigned in signed int negative Werte entstehen.

Deshalb ist eine expliziete Umwandlung mittel inet_ntoa notwendig.
inet_ntoa wird richtigerweise bei der Zuordnung soetwas wie a = b & 0xFF machen.

Das Ergegnis ist 0 < ip-segment < 255


Nun die Frage:
Warum geschieht dieses untypische Verhalten nur auf der mips, oder tatsächlich nur in der build-Umgebung von freetz?


Mit freundlichem Gruß

Homar
 
Zuletzt bearbeitet:
Für solche Ausgaben gibt es die CODE-Tags.
Und von übersichtlichen Programmen hältst Du auch nichts.

Anscheinend möchtest Du hier die IP-Adresse in Text-Form ausgeben. Davon war im ersten Beitrag überhaupt nicht die Rede, dort ging es um ein Connect. Hat das überhaupt etwas miteinander zu tun? Wenn Du die Adresse erst in Text umwandelst und danach wieder in eine Adresse, warum dann so umständlich?

Ansonsten würde ich mal die Man-Pages empfehlen, und ein Buch über C.
Die Funktion inet_ntoa ist genau dafür da, eine Adresse in Text-Form umzuwandeln, also warum sollte man sie nicht verwenden?

Gehen wir das mal im einzelnen durch:
> gethostbyname() löst die Domain auf und erstellt ein struct-gebilde vom Typ hostent auf dem Stack.
Das die Struktur auf dem Stack erstellt wird, halte ich für ein Gerücht. Ist aber hier nicht weiter wichtig.
Was sagt aber das Manual zum Rückgabewert der Funktion im Fehlerfall? Und was machst Du in dem Programm?

> In diesem Gebilde gibt es einen Array h_addr_list, die die IP-Adresse der Domain haben sollte.
> Dieser ist normalerweise von Typ unsigned int.
Wie kommst Du darauf? char **h_addr_list

> Normalerweise funktioniert es auch so auf verschiedenen Plattformen; nur nicht in der Fritzbox.
Anscheinend haben Deine anderen Plattformen als Default unsigned char, dafür gibt es aber keine Garantie. Wenn Du unsigned char willst, solltest Du das sicherheitshalber angeben.

> Teilelemente des Arrays h_addr_list wird in der Fritz mit Werten gefüllt, die so gross sind, das bei einer implizieten Umwandlung von unsigned in signed int negative Werte entstehen.
Bei der Umwandlung von unsigned char nach signed int können nie negative Werte entstehen.

> Deshalb ist eine expliziete Umwandlung mittel inet_ntoa notwendig.
Wie schon geschrieben, wenn die Funktion schon da ist, ist es besser, sie zu nutzen, als es von Hand nochmal zu machen. Und noch viel besser ist es, auf diese unnötige Umwandlung komplett zu verzichten.

> Warum geschieht dieses untypische Verhalten nur auf der mips, oder tatsächlich nur in der build-Umgebung von freetz?
Weil Du Annahmen über den Typ char machst, die nicht vom Standard abgedeckt sind.
 
>Für solche Ausgaben gibt es die CODE-Tags.
erledigt


>Anscheinend möchtest Du hier die IP-Adresse in Text-Form ausgeben. Davon war im ersten Beitrag überhaupt nicht die Rede, dort ging es um ein Connect.
Zu einer negativen IP ließ sich so schlecht connecten :)


>Hat das überhaupt etwas miteinander zu tun? Wenn Du die Adresse erst in Text umwandelst und danach wieder in eine Adresse, warum dann so umständlich?
Weil ich Intern noch damit arbeite und Redundanzen im Code dadurch verhindere.


>Ansonsten würde ich mal die Man-Pages empfehlen, und ein Buch über C.
Billige Sprüche kannst du dir sparen !!!


>Die Funktion inet_ntoa ist genau dafür da, eine Adresse in Text-Form umzuwandeln, also warum sollte man sie nicht verwenden?
Jetzt habe ich es gelernt - kannte ich vorher nicht


>>> In diesem Gebilde gibt es einen Array h_addr_list, die die IP-Adresse der Domain haben sollte.
>>> Dieser ist normalerweise von Typ unsigned int.
>Wie kommst Du darauf? char **h_addr_list
Gestern abend im Coder-Forum gelesen.
btw... char ** bedeutet Pointer auf die Anfangsadresse eines Arrays. Ob das Array ein unsigned char Array ist, bezweifele ich, da ich negative Werte erhalten habe; somit müssen es hier um integer-Werte handeln.

>>> Teilelemente des Arrays h_addr_list wird in der Fritz mit Werten gefüllt, die so gross sind, das bei einer implizieten Umwandlung von unsigned in signed int negative Werte entstehen.
>Bei der Umwandlung von unsigned char nach signed int können nie negative Werte entstehen.
Stimmt! Wenn das denn so sein sollte

>Und noch viel besser ist es, auf diese unnötige Umwandlung komplett zu verzichten.
Ich würde so eine gewagte Aussage nicht treffen, wenn ich denn nicht die restlichen Teile der Sourcen kenne.


MFG
Homar
 
Zuletzt bearbeitet:
Mal ehrlich, wenn du noch Hilfe bekommst bei dem Tonfall, wundere ich mich. Du bittest hier um Hilfe, bekommst sie und pampst den an, der dir hilft/helfen will?

Btw scheint Ralfs Tipp, wenn auch von dir als "billige Sprüche" abgetan, durchaus von Relevanz zu sein. Vor allem der Teil mit dem signed/unsigned char ist in meinen Augen von wirklicher Relevanz, denn es gibt durchaus unterschiede von Plattform zu Plattform, da kannst du nicht einfach lustig in der Gegend rumcoden und Annahmen treffen, die nicht den Spezifikationen entsprechen. Lies somit noch einmal nach....
 
Ich habe nicht rumgepappt, nicht bewusst.

Und geholfen?

Liess dir Bitte mal von oben nach unten durch... Ich sehe nirgends, wo er mir einen TIP gegeben haben sollte, der mir weitergeholfen hätte.

Naja... Niemand wird sich als kleines Kind behandelt wissen.

...Annahmen treffen, die nicht den Spezifikationen entsprechen....
Welche Spezifikationen??? - Das sieht mir eher nach einem Bug aus!

Wir können uns ja darauf einigen, das er mir das nächste mal nicht hilft :p

Dass brauche ich auch nicht, was in diesem Thread abgelaufen ist.
 
Oh, ich hab gelesen, und bin hier raus. Gibt anscheinend Leute, die keine Hinweise in die richtige Richtung haben wollen.
 
>Anscheinend möchtest Du hier die IP-Adresse in Text-Form ausgeben. Davon war im ersten Beitrag überhaupt nicht die Rede, dort ging es um ein Connect.
Zu einer negativen IP ließ sich so schlecht connecten :)
>Hat das überhaupt etwas miteinander zu tun? Wenn Du die Adresse erst in Text umwandelst und danach wieder in eine Adresse, warum dann so umständlich?
Weil ich Intern noch damit arbeite und Redundanzen im Code dadurch verhindere.
Die IP ist nicht negativ. Du machst nur eine unnötige Umwandlung Adresse->Text->Adresse, und der Teil davon, den Du von Hand machst, ist fehlerhaft. Und daß Du damit Redundanzen im Code verhinderst, glaube ich Dir nicht. Ich glaube Dir aber, daß Du auch an eine noch schlechtere Alternative gedacht hast.

>Ansonsten würde ich mal die Man-Pages empfehlen, und ein Buch über C.
Billige Sprüche kannst du dir sparen !!!
Wer hat was von billig gesagt? Anscheinend hatte ich vergessen zu erwähnen, daß Nachhilfe in C hier kostenpflichtig ist.
>Wie kommst Du darauf? char **h_addr_list
Gestern abend im Coder-Forum gelesen.
btw... char ** bedeutet Pointer auf die Anfangsadresse eines Arrays. Ob das Array ein unsigned char Array ist, bezweifele ich, da ich negative Werte erhalten habe; somit müssen es hier um integer-Werte handeln.
Und deswegen werde ich diesen Satz auch nicht richtig stellen, solange diese Nachhilfe nicht bezahlt ist.
>Und noch viel besser ist es, auf diese unnötige Umwandlung komplett zu verzichten.
Ich würde so eine gewagte Aussage nicht treffen, wenn ich denn nicht die restlichen Teile der Sourcen kenne.
Mit anderen Worten, besser am Anfang nachdenken und gleich richtig machen, als später umständlich korrigieren.
Ich habe nicht den Eindruck, daß ich die restlichen Teile der Sourcen kennen möchte.
 
last comment

danke für deine Mühe, mir weiterhelfen zu wollen.

Du hast dich bemüht, manchmal reicht es aber leider nicht aus.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.