[FHZ] wie Feststellen, ob Socketpartner noch da ist?

Begonnen von Tommi, 01 Mai 2008, 11:51:49

Vorheriges Thema - Nächstes Thema

Tommi

                                                     

Hallo,
ich plage mich schon seit einiger Zeit rum festzustellen, ob mein
Partner einer Socketverbindung noch da ist. Dabei nutze ich IO:.Select
und IO:Handles.

my $ServerPort=$ARGV[1];
if ($ServerPort) {
    $server=IO::Socket::INET->new(LocalPort=>$ServerPort,
                                 ReuseAddr=>1,
                                 Listen=>10,
                                 timeout=>1,
                                 blocking=>0
                                 );
    die "ServerStart-Error: $@ \n" if !$server;
    $clients=IO::Select->new($server);
}
....

while(my @ready=$clients->can_read(1)) {
                foreach $fh (@ready) {
                    if ($fh==$server) {
                        #new connection waiting
                        my $new=$server->accept;
                        $new->autoflush(1);
                        $new->blocking(0);
                        $new->timeout(1);
                        $clients->add($new);
                        my $host=$new->peerhost;
                        $sockets{$new}=$host;
                        print "\nNew Client:".$host."\n";
                    }else{
                        #read vom client
                        my $out=undef;
                        $fh->read($out,1);
                        $message{$fh}=$out;
                    }
                }
            }
            #check living connections
            foreach my $fh($clients->handles) {
                   next if $fh==$server;
                   next if ($fh->peerhost);
                   print "Terminate ".$sockets{$fh}. " by Check1\n";
                    Client_disconnect($fh);
            }

Die Prüfung hier ist also mit der peerhost function.
eof() nutzt irgendwie gar nicht, das kommt schon bei einem normalen
read.

Gibt es einen sicheren (nonblocking) Weg, um tote Verbindungen zu
erkennen?

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

rudolfkoenig

                                                   

Aeh... Das hat aber mit fhem nichts zu tun oder?

Ich verwende lieber select statt blocking reads oder threads, siehe
fhem.pl
Da das OS tote Verbindungen auch nicht sofort mitkriegt, muss man den
TCP KeepAlive (kernel?) Parameter setzen. Bin nicht sicher, ob das pro
Verbindung geht, wenn ja, dann fehlt noch ein setsockopt.

  Gruss,
    Rudi
--~--~---------~--~----~------------~-------~--~----~
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

                                                     

> Aeh... Das hat aber mit fhem nichts zu tun oder?
Doch schon.
Ich bastle (wie schon mal hier erwähnt) an einer Socket-Variante des
FHZ-Moduls.
Bei der Gelegenheit habe ich gleich noch eins für ws2x00 in der
queue(als Socket und für den elv Empfänger), was zumindest als
standalone version schon tut, nur leider hängenbleibt, wenn der Client
nicht reagiert und damit Daten vom Server verloren gehen.

> Ich verwende lieber select statt blocking reads oder threads, siehe
> fhem.pl
> Da das OS tote Verbindungen auch nicht sofort mitkriegt, muss man den
> TCP KeepAlive (kernel?) Parameter setzen. Bin nicht sicher, ob das pro
> Verbindung geht, wenn ja, dann fehlt noch ein setsockopt.
Ich dachte, das IO::Select macht das auch genau so (nur ohne das man
sich selber mit den vec() -Functionen rumstreiten muss).
Mal sehen, dann lasse ich es erstmal so und feile lieber an der
Hauptfunktion.

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

Dr. Boris Neubert

                                                   

> Ich bastle (wie schon mal hier erwähnt) an einer Socket-Variante des
> FHZ-Moduls.

Dann empfehle ich im Initialize / Define Funktion des Moduls hash-
>{FD} und hash->{ReadFn}
zu setzen, dann wirst Du vom globalen select() mitversorgt.

Gruss,
  Rudi
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~-
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Guest

Originally posted by: <email address deleted>

Hi,

Rudolf Koenig:
> Da das OS tote Verbindungen auch nicht sofort mitkriegt, muss man den
> TCP KeepAlive (kernel?) Parameter setzen. Bin nicht sicher, ob das pro
> Verbindung geht, wenn ja, dann fehlt noch ein setsockopt.
>
Klar geht das. setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,1).

--
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
 - -
Your lucky number is 3552664958674928.  Watch for it everywhere.

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

                                                     

> Klar geht das. setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,1).
Danke, probiere ich aus.
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
-~----------~----~----~----~------~----~------~--~-