[FHZ] Selectfehler auf Socket

Begonnen von Tommi, 05 Mai 2008, 18:22:55

Vorheriges Thema - Nächstes Thema

Tommi

                                                     

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

Guest

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

Tommi

                                                     

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