45 |
|
|
46 |
# Cache getprotobyname result as on some systems it is slow. |
# Cache getprotobyname result as on some systems it is slow. |
47 |
$Meteor::Socket::TCP_PROTO_NAME=getprotobyname('tcp'); |
$Meteor::Socket::TCP_PROTO_NAME=getprotobyname('tcp'); |
48 |
|
$Meteor::Socket::UDP_PROTO_NAME=getprotobyname('udp'); |
49 |
} |
} |
50 |
|
|
51 |
############################################################################### |
############################################################################### |
119 |
|
|
120 |
select((select($self->{'handle'}),$|=1)[0]); |
select((select($self->{'handle'}),$|=1)[0]); |
121 |
|
|
122 |
|
my $vec=''; |
123 |
|
vec($vec,CORE::fileno($self->{'handle'}),1)=1; |
124 |
|
$self->{'handleVec'}=$vec; |
125 |
|
|
126 |
|
return $self; |
127 |
|
} |
128 |
|
|
129 |
|
sub newUDPServer { |
130 |
|
my($class,$port,$srcIP)=@_; |
131 |
|
|
132 |
|
($port) || die("$class: port undefined!"); |
133 |
|
|
134 |
|
my $self=$class->new; |
135 |
|
|
136 |
|
my $localAdr=INADDR_ANY; |
137 |
|
$localAdr=inet_aton($srcIP) if(defined($srcIP) && $srcIP ne ''); |
138 |
|
|
139 |
|
my $local; |
140 |
|
my $sockType=PF_INET; |
141 |
|
my $proto=$Meteor::Socket::UDP_PROTO_NAME; |
142 |
|
|
143 |
|
$self->{'port'}=$port; |
144 |
|
($local=sockaddr_in($port,$localAdr)) |
145 |
|
|| die("$class: sockaddr_in for port '$port' failed"); |
146 |
|
|
147 |
|
$self->{'handle'}=$self->nextHandle(); |
148 |
|
$self->{'socketType'}=$sockType; |
149 |
|
|
150 |
|
socket($self->{'handle'},$sockType,SOCK_DGRAM,$proto) |
151 |
|
|| die("$class socket: $!"); |
152 |
|
|
153 |
|
setsockopt($self->{'handle'},SOL_SOCKET,SO_REUSEADDR,pack("l", 1)) |
154 |
|
|| die("setsockopt: $!"); |
155 |
|
|
156 |
|
bind($self->{'handle'},$local) |
157 |
|
|| die("$class bind: $!"); |
158 |
|
|
159 |
|
select((select($self->{'handle'}),$|=1)[0]); |
160 |
|
|
161 |
my $vec=''; |
my $vec=''; |
162 |
vec($vec,CORE::fileno($self->{'handle'}),1)=1; |
vec($vec,CORE::fileno($self->{'handle'}),1)=1; |
163 |
$self->{'handleVec'}=$vec; |
$self->{'handleVec'}=$vec; |