ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > bsd socket EOF? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
1 -2- | [ - Beitrag schreiben - ] |
03.04.2009, 14:10 Uhr Mad_Dog Posts: 1944 Nutzer |
Zitat: Ohne eine Schleife bekommst Du aber immer nur das erste Stück der Datei - und zwar genau so viel davon, wie in den Puffer passt. -- http://www.norman-interactive.com [ - Antworten - Zitieren - Direktlink - ] |
03.04.2009, 15:12 Uhr MaikG Posts: 5172 Nutzer |
Zitat:Original von MaikG: Aber der fall -1 tritt gar nicht auf??? >Warum sollte er auch? >Du benutzt immer noch MSG_PEEK, und das kann nicht blocken, als tritt >der Fehler EWOULDBLOCK (was heißt das auf deutsch?) auch nicht auf. Grade weil MSG_PEEK blocken kann habe ich doch ioctl benutzt statt MSG_PEEK um die verfügbare Menge an Daten zu erhalten. Würde Blocken auf Deutsch, und was bedeutet jetzt EOF? Sag jetzt nicht 0 bei MSG_PEEK, denn sobald ich die Prüfung auf </html> zum erkennen des Endes rausgenommen habe wurde es super lahm. D.h. 0 trat nicht bei EOF auf. >Außerdem solltest Du mal darüber nachdenken, ob es nicht sinnvoller >wäre, dem TCP/IP-Stack die Adresse für die Fehlernummer mitzuteilen, >bevor ein Fehler auftritt... Achso ja, verwende ich das 1. mal. Andere OS Funktionen geben den wert ja direkt zurück. >Ohne eine Schleife bekommst Du aber immer nur das erste Stück der >Datei - und zwar genau so viel davon, wie in den Puffer passt. Ich weiss, deshalb ist der Puffer auch größer als die "Datei" [ Dieser Beitrag wurde von MaikG am 03.04.2009 um 15:13 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
03.04.2009, 17:39 Uhr Holger Posts: 8116 Nutzer |
Zitat:Herrje, was willst Du denn nun eigentlich? Willst Du die Daten lesen oder geht es Dir darum, alle bislang unternommenen, nicht funktionierenden Versuche zusammen in einem Programm zu kombinieren? Es ist doch so einfach: mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.04.2009, 18:45 Uhr MaikG Posts: 5172 Nutzer |
>Herrje, was willst Du denn nun eigentlich? Eigentlich ein EOF. >Es ist doch so einfach: ># socket auf non-blocking stellen ># Leseanforderung schicken, ohne MSG_PEEK und ohne MSG_WAITALL ># Ergebnis auswerten Okay, ohne MSG_Waitall und MSG_PEEK kommt immer 0 zurück und ich erhalte gar keine Daten. Mit MSG_Waitall siehts schon besser aus, das ende scheint erkannt zu werden(0) und ab und an kommt -1 falls ein Fehler erkannt wird. Allerdings dauert das ganze noch recht lange, da müsste noch ein Timeout für BSD rein. [ - Antworten - Zitieren - Direktlink - ] |
05.04.2009, 11:53 Uhr MaikG Posts: 5172 Nutzer |
Zitat: Gibt immer -1 zurück mit "Invalid Argument" tval&(0)=15 tval&(1)=0 result&=setsockopt(fd&, SOL_SOCKET&, SO_RCVTIMEO&, VARPTR(tval&(0)), 8 ) [ Dieser Beitrag wurde von MaikG am 05.04.2009 um 11:54 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
05.04.2009, 14:16 Uhr DrNOP Posts: 4118 Nutzer |
Zitat:Ok, da hast du: EOF. -- Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker [ - Antworten - Zitieren - Direktlink - ] |
08.04.2009, 15:22 Uhr MaikG Posts: 5172 Nutzer |
Ich glaube da stimmt evtl. was mit den Includes nicht. Beim schalten auf Nonblocking mit ioctl bekomme ich auch -1 und als Errno unsupported. Ioctl mit den zur verfügung stehenden daten geht jedoch. [ - Antworten - Zitieren - Direktlink - ] |
09.04.2009, 10:26 Uhr Holger Posts: 8116 Nutzer |
Zitat:Der Verdacht, dass das Problem irgendwo bei Dir liegt, ist ja bereits aufgetreten. Nur kennen wir Deine includes nicht, und können somit auch kaum etwas überprüfen... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
09.04.2009, 11:13 Uhr MaikG Posts: 5172 Nutzer |
@Holger: Sorry. Ich benutze die bmap von Ralf27, welche identisch ist mit der aus einem Aminet archiv und der die ich mir selbst erzeugt habe. LIBRARY DECLARE "bsdsocket.library" DECLARE FUNCTION Socket&(domain%,type%,protocol%) LIBRARY DECLARE FUNCTION Connect&(fd&,addr&,addrLen%) LIBRARY DECLARE FUNCTION Send&(fd&,bufAddr&,bufLen&,flags&) LIBRARY DECLARE FUNCTION Recv&(fd&,bufAddr&,bufLen&,flags&) LIBRARY DECLARE FUNCTION setsockopt&(fd, SOL_SOCKET, SO_RCVTIMEO, &tval, sizeof) LIBRARY DECLARE FUNCTION IoctlSocket&(fd&,Arg&,Adr&) LIBRARY DECLARE FUNCTION GetHostByName&(NAME&) LIBRARY DECLARE FUNCTION CloseSocket&(fd&) LIBRARY DECLARE FUNCTION Errno&() LIBRARY DECLARE SUB SetErrnoPtr(errno_p&, size%) LIBRARY CONST AF_INET% = 2 CONST PF_INET% = 2 CONST SOCK_STREAM% = 1 CONST MSG_OOB%=1 CONST MSG_PEEK%=2 CONST MSG_EOR%=8 CONST MSG_WAITALL%=&h40 CONST MSG_DONTWAIT%=&h80 CONST SOL_SOCKET&=&hFFFF CONST SO_RCVTIMEO&=&h1006 CONST SO_SNDTIMEO&=&h1005 CONST FIONREAD&=&h4004667F& CONST FIONBIO&= &h4004667E& Der aufruf für Nonblocking ist: a&=1:junk&=IoctlSocket&(fd&,FIONBIO&,VARPTR(a&)) junk& ist -1 und Errno ist EOPNOTSUPP 45 Operation NOT supported Tval&(0)=2:Tval&(1)=0 junk&=setsockopt&(fd&, SOL_SOCKET&, SO_RCVTIMEO&, VARPTR(Tval&(0)), 8 ) junk&=setsockopt&(fd&, SOL_SOCKET&, SO_SNDTIMEO&, VARPTR(Tval&(0)), 8 ) bei beiden ist junk& -1 und Errno EINVAL 22 Invalid argument hingegen junk&=IoctlSocket(fd&,FIONREAD&,VARPTR(puffer&)) Funktioniert einwandfrei [ Dieser Beitrag wurde von MaikG am 09.04.2009 um 11:14 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
09.04.2009, 11:47 Uhr Holger Posts: 8116 Nutzer |
Nun ja, ich habe natürlich nicht die Zahlen im Kopf, genaugenommen habe ich nie irgendwas mit den Zahlenwerten zu tun, aberZitat:kann schon nicht stimmen. Die Konstanten für ioctl sind eine Kombination aus Datentyp, Richtung (Lesen/Abfragen oder Schreiben/Setzen) und Bedeutung. Die Abfrage nach vorhandenen bytes im Puffer und das Setzen auf non-blocking müssen sich also definitiv in mehr als einem Bit unterscheiden. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
09.04.2009, 11:56 Uhr Holger Posts: 8116 Nutzer |
Hehe, manchmal ist es gar nicht so schwer. Unter http://www.earlsoft.co.uk/api/constant.php?name=FIONBIO findet sich Const FIONBIO = &H8004667E Das gilt zwar für Windows, aber da so ziemlich alle socket-Implementierungen ursprünglich aus dem bsd-code hervorgegangen sind, ist die Wahrscheinlichkeit ziemlich hoch, dass es auch für den Amiga gilt. Der Wert für FIONREAD scheint jedenfalls auch übereinzustimmen. http://www.earlsoft.co.uk/api/constant.php?name=FIONREAD Const FIONREAD = &H4004667F mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
09.04.2009, 17:38 Uhr MaikG Posts: 5172 Nutzer |
Zitat: Cool, danke das verhält sich schon ganz anders. SOL_SOCKET stimmt auch. SO_SNDTIMO hab ich aus socket.h 0x1005 und RCV 0x1006 sollte eigentlich stimmen ist leider nicht auf der Seite drauf. SO_RCVBUF ist wieder darauf aber gibt auch -1 zurück. [ - Antworten - Zitieren - Direktlink - ] |
1 -2- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > bsd socket EOF? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |