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