… | |
… | |
27 | |
27 | |
28 | =cut |
28 | =cut |
29 | |
29 | |
30 | package Coro::Socket; |
30 | package Coro::Socket; |
31 | |
31 | |
32 | BEGIN { eval { require warnings } && warnings->unimport ("uninitialized") } |
32 | no warnings "uninitialized"; |
|
|
33 | |
|
|
34 | use strict; |
33 | |
35 | |
34 | use Errno (); |
36 | use Errno (); |
35 | use Carp qw(croak); |
37 | use Carp qw(croak); |
36 | use Socket; |
38 | use Socket; |
37 | |
39 | |
38 | use Coro::Util (); |
40 | use Coro::Util (); |
39 | |
41 | |
40 | use base 'Coro::Handle'; |
42 | use base 'Coro::Handle'; |
41 | |
43 | |
42 | $VERSION = 1.9; |
44 | our $VERSION = 1.9; |
|
|
45 | |
|
|
46 | our (%_proto, %_port); |
43 | |
47 | |
44 | sub _proto($) { |
48 | sub _proto($) { |
45 | $_proto{$_[0]} ||= do { |
49 | $_proto{$_[0]} ||= do { |
46 | ((getprotobyname $_[0])[2] || (getprotobynumber $_[0])[2]) |
50 | ((getprotobyname $_[0])[2] || (getprotobynumber $_[0])[2]) |
47 | or croak "unsupported protocol: $_[0]"; |
51 | or croak "unsupported protocol: $_[0]"; |
… | |
… | |
100 | my $fh; |
104 | my $fh; |
101 | |
105 | |
102 | socket $fh, PF_INET, $arg->{Type}, _proto($arg->{Proto}) |
106 | socket $fh, PF_INET, $arg->{Type}, _proto($arg->{Proto}) |
103 | or return; |
107 | or return; |
104 | |
108 | |
105 | $fh = bless Coro::Handle->new_from_fh($fh, timeout => $arg{Timeout}), $class |
109 | $fh = bless Coro::Handle->new_from_fh ( |
|
|
110 | $fh, |
|
|
111 | timeout => $arg->{Timeout}, |
|
|
112 | forward_class => $arg->{forward_class}, |
|
|
113 | ), $class |
106 | or return; |
114 | or return; |
107 | |
115 | |
108 | if ($arg->{ReuseAddr}) { |
116 | if ($arg->{ReuseAddr}) { |
109 | $fh->setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) |
117 | $fh->setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) |
110 | or croak "setsockopt(SO_REUSEADDR): $!"; |
118 | or croak "setsockopt(SO_REUSEADDR): $!"; |