amiga-news 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:
Original von MaikG:
>Wie nun: MIT oder OHNE Schleife?

Waitall ohne, alle anderen mit.

Okay, ich guck mir nonblocking nochmal an.


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: 8038
Nutzer
Zitat:
Original von MaikG:
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.

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:
  • socket auf non-blocking stellen
  • Leseanforderung schicken, ohne MSG_PEEK und ohne MSG_WAITALL
  • Ergebnis auswerten

    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:
    Original von Holger:
    Wie man den timeout eines Sockets setzt, habe ich nicht im Kopf. Spontan fällt mir dazu ein:
    C code:
    struct timeval tval;
    tval.tv_sec = 15;
    tval.tv_usec = 0;
    result = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tval, sizeof(tval));
    if(result==0) printf("timeout set to 15s\n");

    Kann jetzt weder sagen, ob das exakt so richtig ist oder ob bzw. wie das beim Amiga funktioniert.

    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:
    Original von MaikG:
    >Herrje, was willst Du denn nun eigentlich?

    Eigentlich ein EOF.

    Ok, da hast du: EOF. :P
    --
    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: 8038
    Nutzer
    Zitat:
    Original von MaikG:
    Ich glaube da stimmt evtl. was mit den Includes nicht.

    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: 8038
    Nutzer
    Nun ja, ich habe natürlich nicht die Zahlen im Kopf, genaugenommen habe ich nie irgendwas mit den Zahlenwerten zu tun, aber
    Zitat:
    Original von MaikG:
    CONST FIONREAD&=&h4004667F&
    CONST FIONBIO&= &h4004667E&

    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: 8038
    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:
    Original von Holger:
    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.


    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 © 1997-2019 by amiga-news.de - alle Rechte vorbehalten.
    .