mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
FHEM2FHEM: Use NonBlocking connect (Forum #55194)
git-svn-id: https://svn.fhem.de/fhem/trunk@11732 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
0770652e1b
commit
38780ee2b4
@ -5,6 +5,7 @@ package main;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Time::HiRes qw(gettimeofday);
|
use Time::HiRes qw(gettimeofday);
|
||||||
|
use HttpUtils;
|
||||||
|
|
||||||
|
|
||||||
sub FHEM2FHEM_Read($);
|
sub FHEM2FHEM_Read($);
|
||||||
@ -110,6 +111,7 @@ FHEM2FHEM_Write($$)
|
|||||||
syswrite($hash->{TCPDev2}, $hash->{portpassword} . "\n")
|
syswrite($hash->{TCPDev2}, $hash->{portpassword} . "\n")
|
||||||
if($hash->{portpassword});
|
if($hash->{portpassword});
|
||||||
}
|
}
|
||||||
|
|
||||||
my $rdev = $hash->{rawDevice};
|
my $rdev = $hash->{rawDevice};
|
||||||
syswrite($hash->{TCPDev2}, "iowrite $rdev $fn $msg\n");
|
syswrite($hash->{TCPDev2}, "iowrite $rdev $fn $msg\n");
|
||||||
}
|
}
|
||||||
@ -222,56 +224,48 @@ FHEM2FHEM_OpenDev($$)
|
|||||||
Log3 $name, 3, "FHEM2FHEM opening $name at $dev"
|
Log3 $name, 3, "FHEM2FHEM opening $name at $dev"
|
||||||
if(!$reopen);
|
if(!$reopen);
|
||||||
|
|
||||||
# This part is called every time the timeout (5sec) is expired _OR_
|
return if($hash->{NEXT_OPEN} && time() <= $hash->{NEXT_OPEN});
|
||||||
# somebody is communicating over another TCP connection. As the connect
|
|
||||||
# for non-existent devices has a delay of 3 sec, we are sitting all the
|
|
||||||
# time in this connect. NEXT_OPEN tries to avoid this problem.
|
|
||||||
if($hash->{NEXT_OPEN} && time() < $hash->{NEXT_OPEN}) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return if(IsDisabled($name));
|
return if(IsDisabled($name));
|
||||||
|
|
||||||
my $conn;
|
my $doTailWork = sub($$$) {
|
||||||
if($hash->{SSL}) {
|
my ($h, $err, undef) = @_;
|
||||||
eval "use IO::Socket::SSL";
|
|
||||||
Log3 $name, 1, $@ if($@);
|
|
||||||
$conn = IO::Socket::SSL->new(PeerAddr => "$dev") if(!$@);
|
|
||||||
} else {
|
|
||||||
$conn = IO::Socket::INET->new(PeerAddr => $dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($conn) {
|
if($err) {
|
||||||
|
Log3($name, 3, "Can't connect to $dev: $!") if(!$reopen);
|
||||||
|
$readyfnlist{"$name.$dev"} = $hash;
|
||||||
|
$hash->{STATE} = "disconnected";
|
||||||
|
$hash->{NEXT_OPEN} = time()+60;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
my $conn = $h->{conn};
|
||||||
delete($hash->{NEXT_OPEN});
|
delete($hash->{NEXT_OPEN});
|
||||||
$conn->setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1);
|
$conn->setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1);
|
||||||
|
$hash->{TCPDev} = $conn;
|
||||||
|
$hash->{FD} = $conn->fileno();
|
||||||
|
delete($readyfnlist{"$name.$dev"});
|
||||||
|
$selectlist{"$name.$dev"} = $hash;
|
||||||
|
|
||||||
} else {
|
if($reopen) {
|
||||||
Log3($name, 3, "Can't connect to $dev: $!") if(!$reopen);
|
Log3 $name, 1, "FHEM2FHEM $dev reappeared ($name)";
|
||||||
$readyfnlist{"$name.$dev"} = $hash;
|
} else {
|
||||||
$hash->{STATE} = "disconnected";
|
Log3 $name, 3, "FHEM2FHEM device opened ($name)";
|
||||||
$hash->{NEXT_OPEN} = time()+60;
|
}
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
$hash->{TCPDev} = $conn;
|
$hash->{STATE}= "connected";
|
||||||
$hash->{FD} = $conn->fileno();
|
DoTrigger($name, "CONNECTED") if($reopen);
|
||||||
delete($readyfnlist{"$name.$dev"});
|
syswrite($hash->{TCPDev}, $hash->{portpassword} . "\n")
|
||||||
$selectlist{"$name.$dev"} = $hash;
|
if($hash->{portpassword});
|
||||||
|
my $msg = $hash->{informType} eq "LOG" ?
|
||||||
|
"inform on $hash->{regexp}" : "inform raw";
|
||||||
|
syswrite($hash->{TCPDev}, $msg . "\n");
|
||||||
|
};
|
||||||
|
|
||||||
if($reopen) {
|
return HttpUtils_Connect({ # Nonblocking
|
||||||
Log3 $name, 1, "FHEM2FHEM $dev reappeared ($name)";
|
url => $hash->{SSL} ? "https://$dev/" : "http://$dev/",
|
||||||
} else {
|
NAME => $name,
|
||||||
Log3 $name, 3, "FHEM2FHEM device opened ($name)";
|
noConn2 => 1,
|
||||||
}
|
callback=> $doTailWork
|
||||||
|
});
|
||||||
$hash->{STATE}= "connected";
|
|
||||||
DoTrigger($name, "CONNECTED") if($reopen);
|
|
||||||
syswrite($hash->{TCPDev}, $hash->{portpassword} . "\n")
|
|
||||||
if($hash->{portpassword});
|
|
||||||
my $msg = $hash->{informType} eq "LOG" ?
|
|
||||||
"inform on $hash->{regexp}" : "inform raw";
|
|
||||||
syswrite($hash->{TCPDev}, $msg . "\n");
|
|
||||||
return undef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
@ -338,7 +332,8 @@ FHEM2FHEM_Set($@)
|
|||||||
<a name="FHEM2FHEMdefine"></a>
|
<a name="FHEM2FHEMdefine"></a>
|
||||||
<b>Define</b>
|
<b>Define</b>
|
||||||
<ul>
|
<ul>
|
||||||
<code>define <name> FHEM2FHEM <host>[:<portnr>][:SSL] [LOG:regexp|RAW:devicename] {portpassword}
|
<code>define <name> FHEM2FHEM <host>[:<portnr>][:SSL]
|
||||||
|
[LOG:regexp|RAW:devicename] {portpassword}
|
||||||
</code>
|
</code>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -332,7 +332,7 @@ DevIo_OpenDev($$$;$)
|
|||||||
use HttpUtils;
|
use HttpUtils;
|
||||||
my $err = HttpUtils_Connect({ # Nonblocking
|
my $err = HttpUtils_Connect({ # Nonblocking
|
||||||
timeout => $timeout,
|
timeout => $timeout,
|
||||||
url => "http://$dev/", # not really http
|
url => $hash->{SSL} ? "https://$dev/" : "http://$dev/",
|
||||||
NAME => $hash->{NAME},
|
NAME => $hash->{NAME},
|
||||||
noConn2 => 1,
|
noConn2 => 1,
|
||||||
callback=> sub() {
|
callback=> sub() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user