Thread Net::SSH2 mit IO::Socket::INET6 (3 answers)
Opened by Jejerod at 2012-06-22 15:08

Jejerod
 2012-06-22 15:08
#159319 #159319
User since
2011-10-12
16 articles
BenutzerIn
[default_avatar]
Long time, no see.

Kürzlich habe ich eine Anwendung die CPAN:Net::SSH2 verwendet auf IPv6 umstellen wollen. CPAN:Net::SSH2 bietet beim connect statement optional die Möglichkeit einen Socket zu übergeben (anstelle Host, Port).

Für die IPv6 Integration habe ich folglich einen CPAN:IO::Socket::INET6 Socket übergeben. Grundsätzlich funktioniert das auch.

Problem: Bei größeren zu übertragenden Datenmengen nimmt Net::SSH2::Channel->write() zwar alles an, aber es kommt nicht alles auf der anderen Seite an. Bei um und bei 4600 Bytes meldet der Server einen timeout, der Client schickt munter weiter.

Verwendet wird (leider) CPAN:Net::SSH2 v0.18, neuere RPMs sind nicht verfügbar - könnte ich aber zur Not bauen für dieses Release. Betriebssysteme sind CentOS 5 (Client) und Solaris 10 (Server).

Kann es sein das non-blocking IO hier nicht sauber implementiert wurde, oder habe ich da einen Fehler gemacht?

Snippets:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sub channel_write {
   my ($self,$message) = @_;
   return 0 if (! defined $self->{channel});
   eval {
       my $_msglen = length($message);
       my $_written = 0;
       alarm 10;
       my $_msgsend = $self->{channel}->write($message);
       return 0 if (! defined $_msgsend);
       $_written += $_msgsend;
       while ($_written < $_msglen) {
           # not completely xmitted
           my $_todo = substr($message,$_written);
           $_msgsend = $self->{channel}->write($_todo);
           return 0 if (! defined $_msgsend);
           $_written += $_msgsend;
       }
       alarm 0;
   };
   return 0 if ($@);
   return 1;
}

Diese Funktion sollte bei blocking(0) meckern wenn es timeouts gibt. Sie akzeptiert aber alles was ich ihr übergebe und davon kommt trotzdem nicht alles an. Das ganze funktioniert problemlos mit IPv4.

View full thread Net::SSH2 mit IO::Socket::INET6