Mein WS2000 Modul entwickelt sich. Leider bin ich an einer Stelle, wo
ich nicht mehr weiterkomme:
2008.05.05 18:11:52 3: ws2000 opening device xport2:10001
2008.05.05 18:11:52 3: WS2000 connected to device xport2:10001
2008.05.05 18:11:52 3: Set WS2000 rain to 366
2008.05.05 18:11:52 3: Set WS2000 altitude to 152
2008.05.05 18:11:52 0: Server started (version =VERS= from =DATE=
($Id: fhem.pl,v 1.41 2008/04/28 17:27:14 rudolfkoenig Exp $), pid
12331)
Select error -1 / Bad file descriptor
Der Code im WS2000_Define sieht so aus(Ausschnitt)
sub
WS2000_Define($$)
{
my ($hash, $def) = @_;
my $PortName = $a[2];
if ($PortName=~/^\/dev|^COM/) {
#..... code für serielle Schnittstelle
}elsif($PortName=~/([\w.]+):(\d{1,5})/){
#Sockets(hostname:port)
my $host=$1;
my $port=$2;
my $xport=IO::Socket::INET->new(PeerAddr=>$host,
PeerPort=>$port,
timeout=>1,
blocking=>0
);
if (!$xport) {
$hash->{STATE} = "error opening device";
$hash->{READINGS}{WS2000Device}{VAL} = "error
opening device";
$hash->{READINGS}{WS2000Device}{TIME} =
TimeNow();
Log 1,"Error opening Connection to $PortName";
return "Can't Connect to $PortName -> $@ ( $!)\n";
}
$xport->autoflush(1);
$hash->{FD}=$xport->fileno; #egal, ob nur Object oder als
Fileno
$hash->{socket}=1;
}else{
$hash->{STATE} = "$PortName is no device and not
implemented";
$hash->{READINGS}{WS2000Device}{VAL} = "error
opening device";
$hash->{READINGS}{WS2000Device}{TIME} =
TimeNow();
Log 1,"$PortName is no device and not implemented";
return "$PortName is no device and not implemented
\n";
}
Log 3, "WS2000 connected to device $PortName";
$hash->{DeviceName}=$PortName;
return undef;
}
Der Fehler kommt vom Hauptprogramm:
# Main Loop
while (1) {
my ($rout, $rin) = ('', '');
vec($rin, $server->fileno(), 1) = 1;
foreach my $p (keys %defs) {
vec($rin, $defs{$p}{FD}, 1) = 1 if($defs{$p}{FD});
}
foreach my $c (keys %client) {
vec($rin, fileno($client{$c}{fd}), 1) = 1;
}
my $nfound = select($rout=$rin, undef, undef, HandleTimeout());
CommandShutdown(undef, undef) if($sig_term);
if($nfound < 0) {
next if ($! == 0);
die("Select error $nfound / $!\n");
}
#....
Irgendwelche Tipps?
Tommi
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "FHZ1000 users on Linux" group.
To post to this group, send email to FHZ1000-users-on-unix@googlegroups.com
To unsubscribe from this group, send email to FHZ1000-users-on-unix-unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/FHZ1000-users-on-unix?hl=en
-~----------~----~----~----~------~----~------~--~-
Originally posted by: <email address deleted>
Hi,
tommi:
>
> Mein WS2000 Modul entwickelt sich. Leider bin ich an einer Stelle, wo
> ich nicht mehr weiterkomme:
Das ist einfach.
> my $xport=IO::Socket::INET->new(PeerAddr=>$host,
> PeerPort=>$port,
> timeout=>1,
> blocking=>0
> );
Das ist eine lokale Variable ... die am Ende des Blocks freigegeben
wird. Und schon ist der Socket wieder zu.
Die musst du dir wohl noch woanders speichern.
Wenn du
> $hash->{FD}=$xport;
schreibst, setzt das Hauptprogramm im Zweifelsfall irgendein seltsames
Bit im Vektor, aber nicht das mit dem Filedeskriptor korrespondierende.
--
Matthias Urlichs | {M:U} IT Design @ m-u-it.de | smurf@smurf.noris.de
Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de
- -
"I'd love to go out with you, but I did my own thing and now I've got
to undo it."
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "FHZ1000 users on Linux" group.
To post to this group, send email to FHZ1000-users-on-unix@googlegroups.com
To unsubscribe from this group, send email to FHZ1000-users-on-unix-unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/FHZ1000-users-on-unix?hl=en
-~----------~----~----~----~------~----~------~--~-
Vielen Dank!
> Das ist eine lokale Variable ... die am Ende des Blocks freigegeben
> wird. Und schon ist der Socket wieder zu.
>
> Die musst du dir wohl noch woanders speichern.
Habe ich jetzt in $hash-{socket} gelegt.
>
> Wenn du
>
> > $hash->{FD}=$xport;
>
> schreibst, setzt das Hauptprogramm im Zweifelsfall irgendein seltsames
> Bit im Vektor, aber nicht das mit dem Filedeskriptor korrespondierende.
>
das habe ich in $hash->{FD}=$xport->fileno; geändert
Und schon klappts.
Tommi
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "FHZ1000 users on Linux" group.
To post to this group, send email to FHZ1000-users-on-unix@googlegroups.com
To unsubscribe from this group, send email to FHZ1000-users-on-unix-unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/FHZ1000-users-on-unix?hl=en
-~----------~----~----~----~------~----~------~--~-