Schrift
[thread]12660[/thread]

IO::SOCKET::INET recv abbrechen

Leser: 6


<< >> 4 Einträge, 1 Seite
burnersk
 2008-10-20 16:55
#115655 #115655
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Hallo.

Ich habe mir mal so einen kleinen Deamon-'Server' gebastelt. Nun möchte ich gerne das recv abbrechen; oder zumindest wieder etwas senden könenn.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
sub ChldExecute($)
{
  my $client = shift || return (0);
  
  # Server Banner senden
  $client->send('INFO $Server: RSM3D$ $Revision$');
  
  # Warte auf Request
  $client->send('AWTR Await request');
  my $request = eval {
    local $SIG{'ALRM'} = sub { exit(1); };
    my $reqtemp = '';
    alarm(1);
    $client->recv($reqtemp, 2048);
    alarm(0);
    return ($reqtemp);
  };
  
  # Request auswerten
  if (!$request || $request eq '')
  {
    # Fehler beim Empfang des Requests
    
    $client->send('ERROR Request not received');
    $client->send('QUIT');
    return (0);
  }
  else
  {
    # Request jetzt analysieren
    
    $client->send('ERROR Processing not implemented');
    $client->send('QUIT');
    return (0);
  }
  
  $client->send('ERROR Haeh???');
  $client->send('QUIT');
  
  return (1);
}

Wenn ich das mit $client->recv($reqtemp, 2048); auskommentiere, dann wird nach einer Sekunde der andere Text gesendet, andernfalls scheint der Client nach der Sekunde nichts mehr zu lesen.
murphy
 2008-10-20 21:33
#115661 #115661
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Da Du in deinem ALRM-Handler den gesamten Prozess mit exit beendest, ist es nicht verwunderlich, dass danach nichts mehr passiert ;-)

Ich denke, wenn Du wirklich nur das Empfangen von Daten nach einer Sekunde abbrechen möchtest, sollte es ausreichen, den ALRM-Handler auf eine leere Subroutine zu setzen – der Systemaufruf zum Lesen von einem Socket müsste davon trotzdem unterbrochen werden.

Eventuell ist es noch sinnvoll, den Lesepuffer im Signalhandler auf undef oder einen leeren String zu setzen.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-10-20 22:41
#115662 #115662
"exit" beendet das gesamte Programm, auch in einem "eval". Du musst schon "die" verwenden, das wird in einem "eval"-block besonders gehandhabt.
burnersk
 2008-10-21 10:46
#115669 #115669
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
KOPF->WAND

Sry, Leute. Hab nicht nachgedacht.
<< >> 4 Einträge, 1 Seite



View all threads created 2008-10-20 16:55.