DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Http Post Request | [ - Search - New posts - Register - Login - ] |
1 2 3 -4- | [ - Post reply - ] |
2008-05-04, 15:29 h MaikG Posts: 5172 User |
>Wo ist das Problem? Du kannst, wenn Du willst auch sofort >aussteigen, wenn Dir recv() -1 liefert: Ja, schon. Aber ist es nicht besser es nochmal zu probieren? Vielleicht kommt ja beim 2. mal etwas. >Der Overhead, den ich angesprochen habe, bezieht sich nur auf den >Speicherbedarf. Sicher, Du mußt bei derser Methode zur Laufzeit >ständig Speicher beschaffen und die Knoten in die Liste einhängen. >Aber der "Rechenaufwand" (es wird ja nicht wirklich etwas dabei >gerechnet, sondern es finden nur ein paar Zuweisungen statt) >ist zu verschmerzen. Unter Basic könnte das im ungünstigsten Falle schon um einiges länger dauern als in C. [ Dieser Beitrag wurde von MaikG am 04.05.2008 um 15:29 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-05-04, 16:02 h Mad_Dog Posts: 1944 User |
Zitat: Du kannst es natürlich auch mehrmals versuchen, dann musst Du eben einen Zähler einführen, der die Anzahl Deiner Versuche zählt, in etwa so: code:try = 0 Rem Zähler für Versuche t!=TIMER:laenge&=0 WHILE TIMER-t!<5 AND try<5 puffer&=Recv(fd&,MyMemory&+laenge&,1, MSG_PEEK%) IF puffer&>0 THEN IF laenge&+puffer&>maxlaenge& THEN EXIT WHILE position&=Recv(fd&,MyMemory&+laenge&,puffer&, 0) Rem Falls recv fehlschlägt, Zähler hochzählen IF position%=-1 THEN try=try+1 ELSE try=0 laenge&=laenge&+position& ELSEIF puffer&=0 AND laenge&>0 THEN EXIT WHILE ELSE delay 1 END IF WEND Zitat: Ein weitaus größeres Problem sehe ich in der Frage, ob Maxon Basic überhaupt die geeigneten Sprachmittel bietet, um sowas ohne Verrenkungen zu formulieren. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2008-05-04, 16:42 h MaikG Posts: 5172 User |
>Du kannst es natürlich auch mehrmals versuchen, dann musst Du eben >einen Zähler einführen, der die Anzahl Deiner Versuche zählt, >in etwa so: Das mehrfach versuchen ist ja jetzt schon drin. Das beim recv/0, -1 rauskommt kann eigentlich nicht sein, denn ich hole ja nur Daten aus dem bsd puffer. >Ein weitaus größeres Problem sehe ich in der Frage, ob Maxon Basic >überhaupt die geeigneten Sprachmittel bietet, um sowas ohne >Verrenkungen zu formulieren. Ohne Verrenkungen nicht. -> Sowas gibts da z.B. nicht. [ - Answer - Quote - Direct link - ] |
2008-05-04, 22:00 h NoImag Posts: 1050 User |
Zitat: Ralf27 hat mir hier mal gesagt, dass das nichts anderes als ein PEEK + Offset ist (zumindest ungefähr). Für den Test auf das Ende/den Anfang kannst Du Dir eine Funktion schreiben (für alles andere auch, vieles bietet auch schon die exec.library). Die Verrenkungen brauchst Du dann nur einmal für alle Deine zukünftigen Programme zu schreiben. Tschüß [ - Answer - Quote - Direct link - ] |
2008-05-04, 22:47 h MaikG Posts: 5172 User |
>Ralf27 hat mir hier mal gesagt, dass das nichts anderes als ein >PEEK + Offset ist (zumindest ungefähr). Für den Test auf das >Ende/den Anfang kannst Du Dir eine Funktion schreiben (für alles >andere auch, vieles bietet auch schon die exec.library). Ja, ListHead->lh_head wäre dann: PEEKL(ListHead&+lh_head%) Schlimmer(bzw. unübersichtlicher) wirds dann wenn man die Peeks kaskadieren muss. Bei Basic hat man an sich ja keine Pointer. Das sind Long Intergers mit einem Wert. Hat man sich dran gewöhnt ist das einfach, wenn man in Basic und C Programmiert kommt man allerdings schnell durcheinander. [ - Answer - Quote - Direct link - ] |
2008-05-05, 21:03 h Mad_Dog Posts: 1944 User |
Zitat: Pointer sind ja (auf low-Level Ebene) auch nichts anderes, als Variablen , in denen eben eine Adresse steht. Bei modernen Hochsprachen gibts da natürlich noch einen "high-Level Überbau" zwecks Typprüfung usw - jedenfalls bei stark typisierten Sprachen wie z.B. C, C++, Ada usw.. Pointer sollten aber nicht DER Grund sein, der die Implementierung von verketteten Listen in Basic schwierig macht. Viel schwieriger macht es die Tatsasche, daß es (zumindest in Elementar-Basic) nichts gibt, was einem struct in C oder einem Record in Pascal/Modula 2/Ada entspricht. Damit wird es äußerst schwierig, erstmal einen Knoten zu formulieren. Sicher kann man das auch auf Low-Level Ebene machen, indem man maschinennahe Befehle wie PEEk, POKE, DEEK, DOKE, VARPTR usw. verwendet. Aber dann könnte man es fast schon wieder in Assembler machen... -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 05.05.2008 um 21:04 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-05-06, 05:30 h Garg0n Posts: 1 User |
Servus, ich bin ein (leider) ehemaliger amiga user und wollte nur mal kurz was loswerden. Das ist der interessanteste thread den ich im letzten jahr gelesen habe ;-) Ich hab schlicht keine schimmer von der thematik. Aber ich "musste" mir alles durchlesen. Ich finde es wirklich klasse das trotz "einiger" widrigen umstände ihr euch immer noch soviel mühe gebt, es im zu erklären. Hätte ich nach der ersten seite im leben nicht erwartet. kompliment an euch und an die community. Und "MaikG" viel Erfolg :-) Mfg [ - Answer - Quote - Direct link - ] |
2008-05-06, 10:00 h MaikG Posts: 5172 User |
>Viel schwieriger macht es die Tatsasche, daß es (zumindest in >Elementar-Basic) nichts gibt, was einem struct in C oder einem >Record in Pascal/Modula 2/Ada entspricht. Damit wird es äußerst >schwierig, erstmal einen Knoten zu formulieren. Eine structur muss man mittels AllocVec und Poke anlegen. Ist natürlich komplizierter als in C. Vielleicht ist es besser einfach ein Dynamisches LONG Array zu nehmen und da die Speicheradressen reinzupacken. Am Ende dann ein Gesamtbereich Allocieren, umkopieren und Speicher wieder freigeben. [ - Answer - Quote - Direct link - ] |
2008-05-06, 14:26 h Mad_Dog Posts: 1944 User |
Zitat: Wenn es in Maxon Basic dynamische Arrays gibt, dann nimm einfach diese und vergiß die verketteten Listen erstmal. Die verketteten Listen sollen ja hier nur einen dynamischen Speicher liefern. Aber wenn Deine Sprache schon "eingebaute" Sprachmittel bietet, die den selben Zweck erfüllen, brauchst Du das Rad ja nicht neu erfinden. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2008-05-06, 20:05 h NoImag Posts: 1050 User |
Zitat: Ohne das beweisen zu können, vermute ich aber stark, dass dynamische Arrays von MaxonBASIC erheblich langsamer sind, als doppelt verkettete Listen. Tschüß [ - Answer - Quote - Direct link - ] |
2008-05-07, 12:24 h Holger Posts: 8116 User |
Zitat:Maik, ich versuch es mal mit einer Analogie, das scheint ja bei Dir doch noch am Besten zu funktionieren. Was Du damit sagst, ist, dass es eine gute Idee wäre, wenn ein Auto gegen den Baum gefahren ist, noch fünf Mal Gas zu geben, in der Hoffnung, das Problem könnte damit gelöst werden. Wenn Du wissen willst, ob ein weiteres Lesen sinnvoll ist, musst Du den Fehlercode auswerten. Du wirst allerdings feststellen, dass so ziemlich jeder Fehler nach sich zieht, dass Du aus diesem Socket nichts mehr lesen kannst. Wenn Du dann einen Retry einbauen willst, müsstest Du das auf einer höheren Protokoll-Ebene lösen, im Falle von HTTP z.B. nach dem Auftreten eines Fehlers die Verbindung schließen, eine neue aufbauen und einen HTTP1.1-Request mit If-Range senden. Wenn der Server das unterstützt, und die Datei sich nicht verändert hat, bekommst Du dann den Rest. Andernfalls hast Du keine andere Wahl als die gesamte Datei noch mal zu lesen. Zu der Linked-List Problematik: das ist für Deine Zwecke vermutlich Overkill. Mir ging es Gewiss nicht darum, dass Dein Programm für alle zukünftigen Zwecke gerüstet sein muss. Wenn Dein Programm sich mit einer Fehlermeldung ala "Puffer voll" beenden würde, wäre das vollkommen ok. Keinesfall aber solltest Du jemals (und genau das war in Deinem Code das Problem) eine Startadresse und Länge an recv übergeben, die über den Puffer hinausgeht. Das ist leicht sicherzustellen: code:Und natürlich musst Du eben unterscheiden zwischen der Bedingung Puffergröße = Anzahl gelesener Bytes (bevor Du eine Länge von 0 an recv übergibst) und dem Rückgabewert 0 von recv.recv(socket, Pufferstart + Anzahl gelesener Bytes, Puffergröße - Anzahl gelesener Bytes, ...) mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2008-05-08, 11:11 h MaikG Posts: 5172 User |
>Ohne das beweisen zu können, vermute ich aber stark, dass >dynamische Arrays von MaxonBASIC erheblich langsamer sind, >als doppelt verkettete Listen. Ich denke schon, aber MB wird den zugriff auf Listen auch etwas verlangsamen. >Maik, ich versuch es mal mit einer Analogie, das scheint ja bei Dir >doch noch am Besten zu funktionieren. Was Du damit sagst, ist, >dass es eine gute Idee wäre, wenn ein Auto gegen den Baum gefahren >ist, noch fünf Mal Gas zu geben, in der Hoffnung, das Problem >könnte damit gelöst werden. Das kommt aufs Auto an und wie groß der Baum ist. Bei Disketten ist es aber so das es beim 2. 3. 4. oder 5. mal klappen kann. >Wenn Du wissen willst, ob ein weiteres Lesen sinnvoll ist, musst >Du den Fehlercode auswerten. Du wirst allerdings feststellen, >dass so ziemlich jeder Fehler nach sich zieht, dass Du aus >diesem Socket nichts mehr lesen kannst. Okay, muss ich die Fehlerroutine wieder einbauen. [ - Answer - Quote - Direct link - ] |
2008-05-12, 20:14 h Holger Posts: 8116 User |
Zitat:In dem Moment, wenn das DOS an die Anwendung einen Fehlercode zurückgibt, hat das darunterliegende device bereits mehrere Versuche durchgeführt. Wenn die Anwendung dann noch mal trotz Fehlercodes lesen würde, könnte es sich zum einen mehrere Stunden hinziehen, bis endlich abgebrochen wird (weil das device ja auch bei jedem Versuch wieder mehrere Versuche durchführt), zum anderen wären die Daten mit Sicherheit nutzlos, wenn der Leseversuch mit demselben FileHandler (und der ungültig gewordenen Position) stattfinden würde. Gleiches gilt für sockets. Wenn Dir ein Fehlercode zurückgeliefert wird, haben bereits mehrere Versuche stattgefunden. Du kannst es dann gerne trotzdem noch mal versuchen, wenn Du viel Zeit hast. Aber dann besser mit einem neuen socket. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2008-05-13, 00:51 h Wishmaster Posts: 140 User |
Wenn C zu kompliziert ist, kann Mann auch mal einen Blick hierhin werfen. http://aminet.net/search?query=fpc http://aminet.net/search?query=Obrn-A Wirths Programmiersprachen sind sehr strukturiert, schnell erlernbar und äußerst leistungsfähig. Wenn das Objektformat kompatibel ist, kann Mann vorhandene C-Source-Codes auch einfach dazu linken. [ Dieser Beitrag wurde von Wishmaster am 13.05.2008 um 00:52 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
1 2 3 -4- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Http Post Request | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |