schorschi Geschrieben 16. Juni 2006 Teilen Geschrieben 16. Juni 2006 Hallo zusammen, ich bastel gerade am Datenaustausch von Client & Server via Socket. Funktioniert soweit. Nun bin ich an dem Punkt angekommen, wo ich die Internetadresse in die IP auflösen möchten, wenn ich zum Beispiel einen Internetserver ansprechen möchte. Habe auch soweit schon Infos zu der Methode gethostbyname() gefunden. Allerdings bekomme ich immer den Rückgabewert NULL. Ich brauche dazu noch einige allgemeine Infos Da ich aktuelle IP Adressen von Internetseiten haben möchte, kann ich mir schwer vorstellen das ich diese Lokal auf meinem System finden werde. Ich denke mal das ich zunächst eine Verbindung zu einem DNS Server im Netz herstellen muß und die IP anfragen muß. Kann mir da jemand weiterhelfen ? Fast vergessen: VC 6.0 W2k Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 16. Juni 2006 Teilen Geschrieben 16. Juni 2006 ich bastel gerade am Datenaustausch von Client & Server via Socket. Funktioniert soweit. Nun bin ich an dem Punkt angekommen, wo ich die Internetadresse in die IP auflösen möchten, wenn ich zum Beispiel einen Internetserver ansprechen möchte. Habe auch soweit schon Infos zu der Methode gethostbyname() gefunden. Allerdings bekomme ich immer den Rückgabewert NULL. der exakte fehler kann und soll in diesem fall mittels WSAGetLastError ermittelt werden. Ich brauche dazu noch einige allgemeine Infos Da ich aktuelle IP Adressen von Internetseiten haben möchte, kann ich mir schwer vorstellen das ich diese Lokal auf meinem System finden werde. Ich denke mal das ich zunächst eine Verbindung zu einem DNS Server im Netz herstellen muß und die IP anfragen muß. Kann mir da jemand weiterhelfen ? nicht ganz. die namensauflösung erfolgt völlig transparent durch winsock und erfordert nur den abzufragenden host - die windows socketimplementierung entscheidet selbst darüber, welche namensdatenbank verwendet wird; sei es basierend auf dem hostsfile, dem lokalen DNS-cache oder einem externen DNS. siehe auch http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/gethostbyname_2.asp s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schorschi Geschrieben 17. Juni 2006 Autor Teilen Geschrieben 17. Juni 2006 Also die Sache mit dem GetHostByName hat sich insoweit erledigt, das ich im Netz was gefunden habe und für meine Bedürfnisse umgestrickt habe, naja soweit sogut, wenn es den auch so funktionieren möchte wie ich es mir wünsche. Da hat sich dann ein neues Problem gezeigt, wo ich die Ursache nicht lokalisieren kann. Wenn ich eine allgemeine bekannte Internetnamen auflösen möchte wie z.B. google, heise oder andere, dann wird die Adresse gefunden und ich bekomme auf meine Anfrage der jeweiligen index.html auch eine Antwort gesendet welche ich auslesen kann. Wenn ich dagegen meine popelige Seite, welche bei Strato gebucht ist und umgeleitet wird auf meinen Webserver, bekomme ich immer die Fehlermeldung 404 vom Web gesendet. Bin auch gerade mal per Modem ins Netz um zu testen ob die Ursache die Überbrückung meines Routers ist. Fehlanzeige, ich bekomme wieder nur 404 zurück. Wobei da fällt mir gerade auf, du schreibst "erfordert nur den abzufragenden host" ich habe bisher die URL eingegeben. Wie soll ich den an den Rechnernamen kommen wo die Seite gelagert ist ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schorschi Geschrieben 17. Juni 2006 Autor Teilen Geschrieben 17. Juni 2006 Also am Webserver liegt es auch nicht. Sobald ich statisch die IP des Server eingebe, kann ich die Seite korrekt auslesen. Aber je mehr ich Teste, desto mehr Sachen fallen mir auf. Kann mir jemand nen Link nennen (bitte, bitte in deutsch) wo ich nachlesen kann, wie ich nach einen Sendebefehl mit mehreren antwortpacket umgehen kann, sprich auswerten ob noch was kommt, maximale grösse, generell die versendung der Strings... ist mir mal so aufgefallen da ich zum Teil von den Webservern mehr als eine Antwort erhalte, diese zwar nach statischen Vorgaben manipulieren und speichern kann, aber ich denke das mir die statische korrektur auf die Dauer nix bringt. Danke schonmal... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
moo_kuh Geschrieben 17. Juni 2006 Teilen Geschrieben 17. Juni 2006 Wenn ich dagegen meine popelige Seite, welche bei Strato gebucht ist und umgeleitet wird auf meinen Webserver, bekomme ich immer die Fehlermeldung 404 vom Web gesendet. Wobei da fällt mir gerade auf, du schreibst "erfordert nur den abzufragenden host" ich habe bisher die URL eingegeben. Wie soll ich den an den Rechnernamen kommen wo die Seite gelagert ist ? Hallo Schorschi, ich glaube du wirfst da gerade viele Dinge durcheinander. *ordnen* Ich gehe mal davon aus das deine Domain (als Bsp. www.schorschi.de) bei Strato liegt, und du deine Seite aber bei nem anderem Hoster hast, richtig? D.h. wenn du www.schorschi.de aufrust, bekommst du nen redirect zum Hoster deiner Website... Dieser redirect geschieht zu 99% mittels HTTP mitteln, also keine Umsetzung von IP auf IP Den Fehler mit 404 bekommst du von Strato, da deine URL nicht bei Strato verfügbar ist. Gethostbyname arbeitet "nur" mit Hostname zu IP und kennt keine Weiterleitung/Umleitung. Und eine URL zur Namensauflösung zu verwenden ist auch ziemlich fraglich, außer du steigst im Root des Servers ein (z.B. www.schorschi.de/), und bist sicher das die Seite wirklich auf der gehosteten Adresse liegt. Kann mir jemand nen Link nennen (bitte, bitte in deutsch) wo ich nachlesen kann, wie ich nach einen Sendebefehl mit mehreren antwortpacket umgehen kann, sprich auswerten ob noch was kommt, maximale grösse, generell die versendung der Strings... Mit nem Link kann ich nicht dienen, aber wo ist das Problem? Du hast doch noch den Sockethandler und überprüfst einfach ob nach dem ersten recv() noch etwas kommt das größer als 0 Bytes ist? Achtung - recv liest aus was im TCP/IP-Stack steht, d.h. wenn das Packet unterwegs fragmentiert wurde, kommt es nicht vollständig an -> d.h. für dich Packete und Daten zusammenfrickeln ist mir mal so aufgefallen da ich zum Teil von den Webservern mehr als eine Antwort erhalte, diese zwar nach statischen Vorgaben manipulieren und speichern kann, aber ich denke das mir die statische korrektur auf die Dauer nix bringt. Kannst du mal ein Beispiel geben Du machst doch nur nen HTTP GET um die Site wiederzubekommen oder interpretierst du den Inhalt noch und frickelst dir die URLS raus und machst auf diese nochmals nen HTTP GET? Es könnte aber auch wie oben schon angesprochen mit der Fragmentierung zusammenhängen... Wenn du uns mal ein paar Beispiele für die Fehlersituationen gibts, kann man mal genauer analysieren Schönes Wochenende :byby: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schorschi Geschrieben 17. Juni 2006 Autor Teilen Geschrieben 17. Juni 2006 Hallo moo_ku, Mit der Annahme das die Domain bei Arcor liegt und umgeleitet wird liegt Du richtig. schorschi.de] bin ich zwar nicht, aber an der Stelle unwichtig. Deine Info zu gethostbyname() erklärt so einiges, zumindest für mein Verständnis, danke. Zu recy() ich habe mittlerweile gemerkt das eine Anfrage mit GET reicht und das ich mit recy() den TCP/IP-Stack mehrfach auslesen muß. Und wieder ein graues Haar mehr :-0 Ich möchte zunächst einmal den Inhalt der Seite ohne Servermeldung nur speichern, später mal auswerten und wenn die Antwort in mehreren Teilen mit recy() ausgelesen werden muß, dann auch komplett wieder zusammensetzen. Wenn ich das 2.mal recy() aufrufe, steht als erstes ein Zahlenwert im Buffer, welcher nicht zur Seite gehört und den möchte ich auch raus haben bzw habe ich schon. Die Servermeldung, welche ich zum Schluß im Buffer habe, möchte ich auch raus haben. Obwohl ich da vermute das sie dort nicht an der richtigen Stelle steht. Wahrscheinlich habe ich hier schon falsch zusammengeschustert. Kannst Du mir erklären wie ich wenn die Packete und Daten wieder in der korrekten reichenfolge zusammenbauen kann.Man muß die doch irgendwie identifizieren können oder ? Beispiele für die Fehlersituationen: Ja im Augenblick nach den Infos bleibt mir nur noch die Sortiererei der Ergebnisse von recy(), der Rest hat sich ja dann fast alles erledigt. Eine Frage noch zum Schluß, was muß ich mir unter dem Vergleichsstring hier vorstellen, ich weiß nicht wie er arbeitet bzw. was er bedeutet: ptr=strstr(recv_buf,"\x0D\x0A\x0D\x0A")) Dito Schönes Wochenende :e@sy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
moo_kuh Geschrieben 17. Juni 2006 Teilen Geschrieben 17. Juni 2006 Wenn ich das 2.mal recy() aufrufe, steht als erstes ein Zahlenwert im Buffer, welcher nicht zur Seite gehört und den möchte ich auch raus haben bzw habe ich schon. Die Servermeldung, welche ich zum Schluß im Buffer habe, möchte ich auch raus haben. Obwohl ich da vermute das sie dort nicht an der richtigen Stelle steht. Wahrscheinlich habe ich hier schon falsch zusammengeschustert. Kannst Du mir erklären wie ich wenn die Packete und Daten wieder in der korrekten reichenfolge zusammenbauen kann.Man muß die doch irgendwie identifizieren können oder ? Eine Frage noch zum Schluß, was muß ich mir unter dem Vergleichsstring hier vorstellen, ich weiß nicht wie er arbeitet bzw. was er bedeutet: ptr=strstr(recv_buf,"\x0D\x0A\x0D\x0A")) Die Zahlenwerte deuten auf einen Fehler im Bufferhandling hin. Allokierst du auch immer dynamisch Speicher anhand der Größe der empfangenen Bytes? Achte auch darauf das am Ende des Buffer ein \0 steht (kommt durch recv), dies musst du vor/beim zusammenfrickeln wieder entfernen, da es sonst ungewünschte Effekte in der Reihenfolge des empfangenen Textes gibt Hmm um die Reihenfolge brauchst du dich eigentlich nicht zu kümmern, da du ja schon wieder nen OSI-Layer weiter oben arbeitest... (abgesehen von UDP, da ist keine gesicherte Reihenfolge) ptr=strstr(recv_buf,"\x0D\x0A\x0D\x0A")) Als erstes ist hier eine ")" zuviel aber ich denke einfach mal das es ein Tippfehler ist... Im HTTP Protocol ist folgende Zeichenfolge "\x0D\x0A" als newline char definiert, soll heissen hier wird der String recv_buf nach 2 newlines durchsucht. Bye :nett: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schorschi Geschrieben 17. Juni 2006 Autor Teilen Geschrieben 17. Juni 2006 Nein nicht dynamisch, ich deklariere; char buffer[256]; bzw. char buffer[65000]; Abfrage int laenge = recv(s,buffer,65000,0); buffer[laenge]='\0'; Das \0 habe ich übrigens später beim zusammenbau (ich speicher alles in einer Datei) nicht entfernt, gab aber eingentlich auch keine Probleme bisher. Zu \x0D\x0A\x0D\x0A , klar war ein Tippfehler. gut das ich jetzt weiß das es sich nur um einem doppelten Zeilenumbrich handelt. Ich schneide den String selbst beim beim ersten "<" ab, find ich Sinnvoller. Kannst Du mir ein kurzes erklärendes Beispiel für die dyn. Speicherreservierung in dem Fall geben.Ich weiß da im Moment nicht worauf du hinaus willst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
moo_kuh Geschrieben 17. Juni 2006 Teilen Geschrieben 17. Juni 2006 Nein nicht dynamisch, ich deklariere; char buffer[256]; bzw. char buffer[65000]; Abfrage int laenge = recv(s,buffer,65000,0); buffer[laenge]='\0'; Kannst Du mir ein kurzes erklärendes Beispiel für die dyn. Speicherreservierung in dem Fall geben.Ich weiß da im Moment nicht worauf du hinaus willst. Hi, worauf ich hinaus will? Wenn z.B. im ersten recv 6000 Bytes kommen und im 2ten nur noch 4000 weil die Site nicht mehr genug Code bietet um die 6000 Bytes zu füllen, dann wird/kann es passieren das der Inhalt des Buffers nach 4000 Byte auf die alten Werte aus dem ersten recv Lauf zeigt. Und somit bekommst du auch ne falsche Site geliefert... Wie so etwas mit dynamischer Allokierung aussehen kann? (sehr quick & dirty) #DEFINE DEF_BUF_LENGTH 65000 static int main() { char buffer[DEF_BUF_LENGTH]; int bytes; char* pchar; /* hier kommt dein socket code ********************* /* bytes = recv(s,buffer,DEF_BUF_LENGTH,0); pchar = (char *)malloc(sizeof(char)*bytes); memcpy (pchar,buffer,sizeof(char)*bytes); free(pchar); } Vllt. verstehst du jetzt das Problem? Nen schönen Abend noch :byby: Grüße vom Code Monkey der immernoch im Büro sitzt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schorschi Geschrieben 19. Juni 2006 Autor Teilen Geschrieben 19. Juni 2006 Sehr quick sehr dirty, wobei ich sagen muß wenn ich den Buffer mit /0 terminiere dürfte ich das Problem doch eigentlich nicht haben. Ich bin halt einer der Fraktion welcher mit Speicher recht großzügig umgeht, oder anders gesagt, ich reserviere in der Regel keinen Speicher dynamisch.Muß ich mir halt angewöhnen.Wobei, ich habe es eingebaut und es funktioniert. Danke Bleibt noch das Problem das ich mit jedem neuen Aufruf von recv() eine vierstellige Zahl mitgeliefert bekomme, welche nicht zu der Site gehört. Ich versuche gerade herrauszubekommen wo die Zahl herkommt. Habe da schon meine Vermutung das die Zahl mit von meinem Testserver und dem Webserver stammt, da bei fremden Sites von fremden Servern diese Meldung nicht auftritt.Habe übrigens bei bestimmten Sites und das nur beim Webserver eine Fehlermeldung 10054. Laut Web ein Portfehler des Routers. Trotz Reset keine behebung und mit dem Stichwort "geforwardet" konnte ich nix anfangen. Wenn hier keiner eine Antwort weiß, werde ich später einen neuen thread unter Webserver aufmachen, da das ja auch nicht das Thema hier ist. Eine andere Sache: Mir ist aufgefallen wenn ich den Sendepuffer auf einen geringeren Wert stelle als die Seite effektiv groß ist egal ob auf 256, 512 oder 5000, so dauert das Auslesen ewigkeiten, mindestens 30 Sekunden. Stelle ich den Sendepuffer auf 65000, also viel zu groß ein, so bekomme ich innerhalb einer Sekunde sie Site ausgelesen und gespeichert, allerdings mit einer Fehlermeldung zum Schluß "Request-URI too Large". Kann mir das einer erklären ? Nicht das die URI zu lang ist, ist ja denke eine Einstellung vom Webserver, sonder warum dauert das Auslesen mit einem geringeren Wert so lange. Ich denke nicht das es an der Zeit liegt welche die Packet brauchen bis zu meinem Client. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schorschi Geschrieben 19. Juni 2006 Autor Teilen Geschrieben 19. Juni 2006 Kleiner Nachtrag zur Fehlermeldung 10054: Habe gerade den Sendepuffer wie oben beschrieben auf einen sehr kleinen Wert gestellt 256. Keine Fehlermeldung mehr aber eine Zeit zum auslesen der Site von sage und schreibe 3 MINUTEN !!!! Ich verzweifel... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.