Schrift
[thread]5668[/thread]

select() tut unverständliches: select, vec, fileno ....



<< >> 4 Einträge, 1 Seite
Relais
 2003-08-29 19:07
#81357 #81357
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Folgender legacy-Code läuft und läuft. Jedoch nicht mit einem FTP-Proxy...

CMD ist ein Socket mit bestehender FTP-Verbindung.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    $cmd = "quote site ftp.example.com";

...

local($rin);
print CMD $cmd,"\r\n";

vec($rin,fileno(CMD),1) = 1;
for (;;) {
if (($Timeout==0) || select($rout=$rin, undef, undef, $Timeout)) {
unless(sysread(CMD, $buf, 1024)) {
$Error = "Unexpected EOF on command channel";
return undef;
}
}

...

}


Das führt zu ebendem "Unexpected EOF on command channel".
Das Kommando, an dem sich der FTP-Proxy stört lautet allerdings:
"QUOTE site ftp.example.com"

Warum Großbuchstaben beim ersten Wort? Es ist definitiv in dem obigen print noch in Kleinbuchstaben gewesen, daß zeigt der Perl-Debuger.

Manuelles ftp ist auch möglich, das Kommando "quote site ftp.example.com" stellt den Proxy vollständig zufrieden. Nur mit "QUOTE site ftp.example.com" kommt er nicht klar.

Habt ihr ne Idee? Die welt des 4-Argumente-select() ist mir und meinen Kollegen leider ziemlich fremd. Die perldocs zu <!--pod_f1--><a href="//www.perldoc.com/perl5.8.0/pod/func/select.html" target="_blank">perldoc <!--pod_f2-->-f select<!--pod_f3--></a><!--pod_f4-->, <!--pod_f1--><a href="//www.perldoc.com/perl5.8.0/pod/func/vec.html" target="_blank">perldoc <!--pod_f2-->-f vec<!--pod_f3--></a><!--pod_f4--> und <!--pod_f1--><a href="//www.perldoc.com/perl5.8.0/pod/func/fileno.html" target="_blank">perldoc <!--pod_f2-->-f fileno<!--pod_f3--></a><!--pod_f4--> sind sicherlich gut gemeint und zeigen verflixt ähnlichen Code wie den obigen, nur sie beschreiben ihn nicht so, daß ich daraus schlau würde. Ist hier vielleicht jemand bereits so schlau?\n\n

<!--EDIT|Relais|1062169719-->
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
esskar
 2003-08-29 23:14
#81358 #81358
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
frage:

wieso sieht dein code nicht so aus?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for ( ; ; )
{
   if (($Timeout==0) || select(CMD, undef, undef, $Timeout))
   {
      unless(sysread(CMD, $buf, 1024))
      {
         $Error = "Unexpected EOF on command channel";
         return undef;
      }
   }

   ...

}


Nur damit ich es verstehe!\n\n

<!--EDIT|esskar|1062184499-->
Strat
 2003-08-29 23:49
#81359 #81359
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kenne mich mit dem 4-parametrigen select auch nicht aus, weil ich immer IO::Select verwende. Fuer STDIN verwende ich folgenden Cargo-Cult:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $rin = '';
vec($rin,fileno(STDIN),1) = 1;

my $rout;
my $val = "Default";
if (select($rout = $rin,undef,undef,5)){
$val = <STDIN>;
} else {
print "Default used\n";
}

print "\n\nThe value: $val\n";


Bei Net::FTP habe ich das timing out mal mit alarm gemacht. Ich kapiere aber im moment nicht so recht, was du genau wie machen willst
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Dubu
 2003-08-30 12:46
#81360 #81360
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Relais,29.08.2003, 17:07]
Das Kommando, an dem sich der FTP-Proxy stört lautet allerdings:
"QUOTE site ftp.example.com"
[/quote]
Das ist auch kein erlaubtes FTP-Kommando.

Das quote-Kommando ist ein auf FTP-Clients implementierter Befehl, um FTP-Kommandos senden zu koennen, ohne dass sie vom Client vorher interpretiert werden: quote befehl, sendet befehl an den FTP-Server (oder in diesem Fall an den Proxy), wobei befehl ein FTP-Kommando wie GET, PUT, LIST etc. ist.

Ergo: Lass das 'quote' weg und versuch's nochmal.

Quote
Warum Großbuchstaben beim ersten Wort?

Weil FTP-Kommandos in Grossbuchstaben geschrieben werden.
Wenn du im Client ein "dir" oder "ls" eingibst, wird ein "LIST" an den Server gesendet. Ein Server sollte auch Befehle in Kleinbuchstaben akzeptieren, muss es aber nicht. Wahrscheinlich wandelt der Proxy den gesendeten Befehl automatisch in Grossschreibung.

Quote
Es ist definitiv in dem obigen print noch in Kleinbuchstaben gewesen, daß zeigt der Perl-Debuger.

Manuelles ftp ist auch möglich, das Kommando "quote site ftp.example.com" stellt den Proxy vollständig zufrieden.

Klar, dann sendet der Client ja auch ein SITE ftp.example.com an den Proxy.

Quote
Nur mit "QUOTE site ftp.example.com" kommt er nicht klar.

Der Client kennt den Befehl "QUOTE" nicht, nur "quote". :-)
Der Proxy kennt keines von beidem, und das muss er auch nicht.

Quote
Habt ihr ne Idee? Die welt des 4-Argumente-select() ist mir und meinen Kollegen leider ziemlich fremd.

Damit hat das auch nix zu tun.

PS: Es gibt noch die alten FTP-Kommandos QUOT und NQUO, mit denen man direkt den Server ansprechen kann (d.h. es werden alle zwischen QUOT und NQUO gesendeten Befehle direkt an den Server geschickt, ohne weitere Interpretation. Die sind aber im aktuellen Standard nicht mehr enthalten, AFAIK. Ansonsten hilft vielleicht die Doku des Proxys weiter.
<< >> 4 Einträge, 1 Seite



View all threads created 2003-08-29 19:07.