Thread IO::Socket Problem: Socket braucht zu lange (7 answers)
Opened by coax at 2005-05-25 18:48

esskar
 2005-05-30 17:14
#37701 #37701
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ungetestet:
Code: (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use strict;
use warnings;

use IO::Socket::INET;

my $sock = IO::Socket::INET->async_new(
PeerAddr => 'board.perl-community.de',
PeerPort => 80,
Proto => "tcp",
Timeout => 1,
Type => SOCK_STREAM,
AsyncTimeout => 1000
);


package IO::Socket;

use strict;
use warnings;

use threads;
use threads::shared;

my $can_connect = 0;
my $is_shared = 0;

sub async_new_cb {
  my ($self, $sockref, %args) = @_;

  ${$sockref} = $self->new(%args);
  $can_connect = 1;
  cond_signal($can_connect);
}

sub async_new {
  my ($self, %args) = @_;

  $args{AsyncTimeout} ||= 1000;  
 
  my $sockobj = undef;
  my $thread = threads->create('async_new_cb', $self, \$sockobj, %args);
 
  unless($is_shared) {
  share($can_connect);
  $is_shared = 1;
  }

  $can_connect = 0;
  lock($can_connect);
     
  until($can_connect) {  
  last if !cond_timedwait($can_connect, time() + $args{AsyncTimeout});
  }

  return $can_connect ? $sockobj : undef;
}

1;

View full thread IO::Socket Problem: Socket braucht zu lange