2009-08-24 4 views
2

Verwenden von Aktionsskript 3 in Flex Builder 3.Was bedeutet Dateiende auf einem Socket?

Bei der Behandlung eines SOCKET_DATA-Ereignisses erhalte ich gelegentlich scheinbar zufällig eine Fehlermeldung "Fehler 2030: Dateiende wurde gefunden". beim Aufruf von socket.readInt(). Ich bin verwirrt, was dieser Fehler bedeutet, da ich keine Datei lese? Ich bin ein wenig unfamilier mit Steckdosen. Vielen Dank.

Antwort

3

wenn eine Steckdose abzulesen, dass geschlossen ist, erhalten Sie: Error #2002: Operation attempted on invalid socket.

End-of-Datei in der Regel Fehler auf irgendwelchen Bytestreams auftreten, wenn Sie mehr Bytes als verfügbar lesen ... dies ist der Fall für Dateien, Sockets, etc. ... im Fall von Flash, tritt es beim Lesen von einem Socket oder einem ByteArray und vielleicht sogar in anderen Fällen ...

TCP/IP ist paketbasiert, aber emuliert einen Stream. .. also können Sie nur die Daten aus dem Stream lesen, der Ihnen bereits mit TCP-Paketen gesendet wurde ... Überprüfen Sie Socket::bytesAvailable, um herauszufinden, wie viele Bytes derzeit verfügbar sind ... denken Sie immer daran, t Hut die Daten, die Sie an die Buchse in einem Arbeitsgang zu schreiben, in mehrere Pakete ankommen können, jeweils sehr wahrscheinlich verursacht Flash Player socketData Ereignisse auslösen ...

greetz

back2dos

+0

Follow-up für alle anderen mit diesem Problem. Ich denke, das liegt daran, dass ich nur überprüft habe, dass bytesAvailable> 0 ist, was ich aus dem Code von jemand anderem gesehen habe, aber dann readInt, was 4 Byte wäre. Wenn also nur 1 bis 3 Bytes Daten vorhanden wären, würde readInt auf irgendeine Weise hypothetisch ausfallen. – AaronLS

7

Ein Fehler am Ende der Datei bedeutet normalerweise, dass die andere Seite des Sockets ihre Verbindung, IIRC, geschlossen hat.

Der Grund ist es End-of-Datei ist, dass beide mit einer Zahl dargestellt auf ein sehr niedriges Niveau innerhalb eines Programms, eine Datei auf der Festplatte und einen Sockel ist - ein file descriptor - dass das Betriebssystem in übersetzt das Objekt, das eine Datei oder einen Sockel oder eine Pipe oder was auch immer darstellt.

Normalerweise können Sie diese Art von Fehler vermeiden, indem Sie überprüfen, ob Sie gerade ein EOF eingelesen haben. Wenn Sie einen EOF gelesen haben und Sie versuchen, erneut aus dem Socket/der Datei zu lesen, erhalten Sie einen EOF-Fehler.


Update: Nach the ActionScript 9.0 documentation erhalten Sie tatsächlich ein Schließen-Ereignis, wenn das andere Ende den Sockel schließt.

+0

Danke, sollte ich eine bekommen SOCKET_CLOSE-Ereignis oder ähnlich, wenn die andere Seite die Verbindung schließt? – AaronLS

+0

gute Vermutung, aber nicht wahr im Fall von Flash-Player ... siehe meine Antwort ... – back2dos