Autor Thema: Endlosschleife bei Socket Reuse  (Gelesen 670 mal)

Offline ra666ack

  • Developer
  • Full Member
  • ****
  • Beiträge: 133
Endlosschleife bei Socket Reuse
« am: 27 Februar 2015, 07:58:53 »
Hi,

aktuell stehe vor einem Problem, bei dem ich nicht weiterkomme, in der Hoffnung, dass jemand eine Idee hat.
Szenario:
Eine ReadFn ist definiert, die wahlweise UDP und TCP Pakete empfangen kann.
Zuerst wird ein UDP Multicast Socket geöffnet, um eine UPnP SSDP auf Port 1900 Befehl abzusetzen. Die UPnP Renderer melden sich auf 1900 zurück.
$socket_out_udp = IO::Socket::INET->new(LocalPort => '1900', PeerAddr => '239.255.255.250', PeerPort => '1900', Proto => 'udp', Broadcast => '1', ReuseAddr => '1');Mit $socket_out_udp->send($ssdp_search); wird auf den Socket geschrieben.

Anders als bei TCP muss bei UDP ein Empfangssocket zusätzlich geöffnet werden.
$socket_in_udp  = IO::Socket::INET->new(LocalPort => '1900', Proto => 'udp', ReuseAddr => '1');

$hash->{FD}        = $socket_in_udp->fileno();
$hash->{CD}        = $socket_in_udp;
$selectlist{$name} = $hash;

Nachdem der gesuchte Renderer gefunden wurde, wird auch der Empfangs-UDP Socket geschlossen.
close($hash->{CD}) if($hash->{CD});
delete($hash->{FD});
delete($hash->{CD});
delete($selectlist{$name});
Ab jetzt wird die UPNP Kommunikation auf TCP umgestellt.
my $socket_tcp = new IO::Socket::INET(PeerAddr => $address, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM, Timeout => AttrVal($name, "request-timeout", 5));

$hash->{FD}        = $socket_in_udp->fileno();
$hash->{CD}        = $socket_in_udp;
$selectlist{$name} = $hash;

Das Senden funktioniert. Allerdings endet danach das Modul in einer Endlosschleife. Die Rechnerlast liegt bei 90%.  Die ReadFn Funktion wird permanent aufgerufen. Es kommen dort keine Daten an.

Da die UPNP Header recht spezifisch sind, kann die "HttpUtils_NonblockingGet" Funktion nicht benutzt werden, deswegen diese Klimmzüge.

Kann das etwas mit der selectlist zu tun haben, die ich möglicherweise noch nicht ganz überblickt habe?

Habt ihr eine Idee?

Danke und Gruß

ra666ack

 

decade-submarginal