ioctl( SOCK, FIONREAD, $x ) unter OS/2 mit perl 5.8.0

Hallo,

ich rufe die im Subjekt genannte Funktion auf.
Kann es sein, daß die in der oben genannten Version nicht
implementiert ist?
Sie liefert immer FALSE. $x wird zwar mit 256 Byte von irgendwelchem
Müll gefüllt, aber der enthält nicht das erwartete.

FIONREAD habe ich dabei mit verschiednenen Werten versucht, zB. 0x667f
oder 0x4004667f.

Gruß Carsten
Carsten Arnold [ Di, 21 März 2006 08:39 ] [ ID #1239820 ]

Re: ioctl( SOCK, FIONREAD, $x ) unter OS/2 mit perl 5.8.0

* Carsten Arnold [2006-03-21]:

Hallo Carsten,

> ich rufe die im Subjekt genannte Funktion auf.
> Kann es sein, daß die in der oben genannten Version nicht
> implementiert ist?

was sagt deine deine ioctl(2) man-page. Perl reicht die Sachen ja
einfach nur weiter.

> Sie liefert immer FALSE. $x wird zwar mit 256 Byte von irgendwelchem
> Müll gefüllt, aber der enthält nicht das erwartete.

Wenn Perl undef zurückliefert, dann hat ioctl(2) einen Fehler gemeldet.
Was steht denn in $!?

Hast du dir den entsprechenden Eintrag in perlfaq5 durchgelesen?

How can I tell whether there's a character waiting on a filehandle?

> FIONREAD habe ich dabei mit verschiednenen Werten versucht, zB. 0x667f
> oder 0x4004667f.

Warum verschiedene Werte? Du solltest schon den nehmen, der für dein
System definiert ist, und den findest du am einfachsten per

require 'sys/ioctl.ph';

Gruß
Christian

--
Großmann's Gesetz:
Komplexe Probleme haben einfache, leichtverständliche,
aber falsche Lösungen.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Christian Lackas [ Di, 21 März 2006 11:16 ] [ ID #1239824 ]

Re: ioctl( SOCK, FIONREAD, $x ) unter OS/2 mit perl 5.8.0

Am Tue, 21 Mar 2006 10:16:59 UTC schrieb Christian Lackas
<delta [at] lackas.net>:

>was sagt deine deine ioctl(2) man-page. Perl reicht die Sachen ja
>einfach nur weiter.

man-pages gibts hier nicht, aber ein Perl.inf.
Naja, so einfach ist wohl nicht. Schließlich ist der Dritte Parameter
bei der C-Funktion eine Adresse auf einen Speicherbereich. Das muß in
Perl anders dargestellt werden. Ich denke, der Trick mit

my $Value = pack('L',0);
Allokiert den Speicher welcher dann an ioctl übergeben wird. Es steht
am Ende ja auch was drin. Allerdings eben nicht nur die vier Byte die
die 0 einnimmt, sondern 256 Byte.

>Wenn Perl undef zurückliefert, dann hat ioctl(2) einen Fehler gemeldet.
>Was steht denn in $!?

da steht 1.
Vielleicht sollte ich sock_errno aufrufen, ach das ist ja $| ... :-(

>Hast du dir den entsprechenden Eintrag in perlfaq5 durchgelesen?
> How can I tell whether there's a character waiting on a filehandle?

Den hatte ich gelesen, dort hab ich das mit dem pack('L',0) usw. her.

>> FIONREAD habe ich dabei mit verschiednenen Werten versucht, zB. 0x667f
>> oder 0x4004667f.

>Warum verschiedene Werte? Du solltest schon den nehmen, der für dein
>System definiert ist, und den findest du am einfachsten per

Da der Wert für FIONREAD, den ich im C-Programm verwendet habe, wo es
übrigens funktioniert, im Perl nicht funktionierte, hab ich mal
sämtliche H-Files die ich hab wo FIONREAD drin vorkommt, untersucht,
und die Werte benutzt. Interessanterweise, gibts da eben nicht nur
0x667f, sondern auch 0x4004667f.
Ich fand dann raus, daß der High-Teil bestimmen soll, welche
Datenmenge zurück geliefert wird.

> require 'sys/ioctl.ph';

Gibts leider bei mir auch nicht und h2ph hat leider auch nicht so
funktioniert.
Ah, was finde ich denn da, eine Hilfe für h2ph. -h konnte das Script
leider auch nicht. Jetzt finde ich was im Perl.inf.

OK, h2ph ist ausgeführt, hilft leider auch nicht. FIONREAD hat dann,
je nach dem welches H-File ich verwende, die obigen beiden Werte.

Vielleicht liegts ja am EMX. Perl benutzt das ja. Das ist 0.9d, mal
sehen obs was neueres gibt.

Danke erstmal.

Gruß Carsten
Carsten Arnold [ Di, 21 März 2006 16:30 ] [ ID #1239835 ]

Re: ioctl( SOCK, FIONREAD, $x ) unter OS/2 mit perl 5.8.0

Am Tue, 21 Mar 2006 15:30:58 UTC schrieb "Carsten Arnold"
<news [at] ca-arnold.de>:

>>was sagt deine deine ioctl(2) man-page. Perl reicht die Sachen ja
>>einfach nur weiter.
>Vielleicht liegts ja am EMX. Perl benutzt das ja. Das ist 0.9d, mal
>sehen obs was neueres gibt.

Hallo nochmal,

es lag am EMX. Dieses interpretiert den zweiten Parameter anders als
die C-Funktion aus der Socket-DLL die ich in C-Programmen verwende.
EMX reicht die Funktion am Ende zwar auch dorthin durch, will selbst
als
FIONREAD allerdings 0x10 sehen. Damit klappts.

Gruß Carsten
Carsten Arnold [ Sa, 25 März 2006 08:32 ] [ ID #1246060 ]
Perl » de.comp.lang.perl.misc » ioctl( SOCK, FIONREAD, $x ) unter OS/2 mit perl 5.8.0

Vorheriges Thema: Referenz auf Skalar
Nächstes Thema: [de.comp.lang.perl.misc] mini-FAQ <26/10/2004>