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

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

am 21.03.2006 08:39:46 von Carsten Arnold

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

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

am 21.03.2006 11:16:59 von Christian Lackas

* 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

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

am 21.03.2006 16:30:58 von Carsten Arnold

Am Tue, 21 Mar 2006 10:16:59 UTC schrieb Christian Lackas
:

>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

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

am 25.03.2006 08:32:07 von Carsten Arnold

Am Tue, 21 Mar 2006 15:30:58 UTC schrieb "Carsten Arnold"
:

>>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