4 unless(grep /blib/, @INC) {
13 if (-d "lib" && -f "TEST") {
15 if (! $Config{'d_fork'}) {
18 elsif ($Config{'extensions'} !~ /\bSocket\b/) {
19 $reason = 'Socket extension unavailable';
21 elsif ($Config{'extensions'} !~ /\bIO\b/) {
22 $reason = 'IO extension unavailable';
25 print "1..0 # Skip: $reason\n";
35 $SIG{ALRM} = sub { die; };
41 $listen = IO::Socket::INET->new(Listen => 2,
43 # some systems seem to need as much as 10,
44 # so be generous with the timeout
50 # Check if can fork with dynamic extensions (bug in CRT):
52 system "$^X -I../lib -MOpcode -e 'defined fork or die' > /dev/null 2>&1") {
53 print "ok $_ # skipped: broken fork\n" for 2..5;
57 $port = $listen->sockport;
61 $sock = $listen->accept() or die "accept failed: $!";
65 print $sock->getline();
75 } elsif(defined $pid) {
77 $sock = IO::Socket::INET->new(PeerPort => $port,
79 PeerAddr => 'localhost'
81 || IO::Socket::INET->new(PeerPort => $port,
83 PeerAddr => '127.0.0.1'
85 or die "$! (maybe your system does not have a localhost at all, 'localhost' or 127.0.0.1)";
91 print $sock->getline();
100 # Test various other ways to create INET sockets that should
102 $listen = IO::Socket::INET->new(Listen => '', Timeout => 15) or die "$!";
103 $port = $listen->sockport;
108 last SERVER_LOOP unless $sock = $listen->accept;
110 last SERVER_LOOP if /^quit/;
117 } elsif (defined $pid) {
118 # child, try various ways to connect
119 $sock = IO::Socket::INET->new("localhost:$port")
120 || IO::Socket::INET->new("127.0.0.1:$port");
122 print "not " unless $sock->connected;
124 $sock->print("ok 7\n");
127 $sock->print("ok 9\n");
128 $sock->print("done\n");
139 # some machines seem to suffer from a race condition here
142 $sock = IO::Socket::INET->new("127.0.0.1:$port");
144 $sock->print("ok 10\n");
145 $sock->print("done\n");
153 # some machines seem to suffer from a race condition here
156 $sock = IO::Socket->new(Domain => AF_INET,
157 PeerAddr => "localhost:$port")
158 || IO::Socket->new(Domain => AF_INET,
159 PeerAddr => "127.0.0.1:$port");
161 $sock->print("ok 11\n");
162 $sock->print("quit\n");
173 # Then test UDP sockets
174 $server = IO::Socket->new(Domain => AF_INET,
176 LocalAddr => 'localhost')
177 || IO::Socket->new(Domain => AF_INET,
179 LocalAddr => '127.0.0.1');
180 $port = $server->sockport;
182 if ($^O eq 'mpeix') {
183 print("ok 12 # skipped\n")
187 $server->recv($buf, 100);
189 } elsif (defined($pid)) {
191 $sock = IO::Socket::INET->new(Proto => 'udp',
192 PeerAddr => "localhost:$port")
193 || IO::Socket::INET->new(Proto => 'udp',
194 PeerAddr => "127.0.0.1:$port");
195 $sock->send("ok 12\n");
197 $sock->send("ok 12\n"); # send another one to be sure
204 print "not " unless $server->blocking;
207 if ( $^O eq 'qnx' ) {
208 # QNX library bug: Can set non-blocking on socket, but
209 # cannot return that status.
210 print "ok 14 # skipped\n";
212 $server->blocking(0);
213 print "not " if $server->blocking;
218 ### Set up some data to be transfered between the server and
219 ### the client. We'll use own source code ...
222 if( !open( SRC, "< $0")) {
223 print "not ok 15 - $!";
233 my $listen = IO::Socket::INET->new( Listen => 2, Proto => 'tcp', Timeout => 15) ||
236 die if( !defined( $listen));
237 my $serverport = $listen->sockport;
239 my $server_pid = fork();
242 ### TEST 17 Client/Server establishment
247 ### Get data from the server using a single stream
249 $sock = IO::Socket::INET->new("localhost:$serverport")
250 || IO::Socket::INET->new("127.0.0.1:$serverport");
253 $sock->print("send\n");
260 $sock->print("done\n");
263 print "not " if( @array != @data);
270 ### Get data from the server using a stream, which is
271 ### interrupted by eof calls.
272 ### On perl-5.7.0@7673 this failed in a SOCKS environment, because eof
273 ### did an getc followed by an ungetc in order to check for the streams
274 ### end. getc(3) got replaced by the SOCKS funktion, which ended up in
275 ### a recv(2) call on the socket, while ungetc(3) put back a character
276 ### to an IO buffer, which never again was read.
278 if ($^O eq 'mpeix') {
279 print "ok 19 # skipped: broken on MPE/iX\n";
281 $sock = IO::Socket::INET->new("localhost:$serverport")
282 || IO::Socket::INET->new("127.0.0.1:$serverport");
285 $sock->print("send\n");
288 while( !eof( $sock ) ){
295 $sock->print("done\n");
298 print "not " if( @array != @data);
308 $sock = IO::Socket::INET->new("localhost:$serverport")
309 || IO::Socket::INET->new("127.0.0.1:$serverport");
312 $sock->print("done\n");
315 print "not " if( 1 != kill 0, $server_pid);
321 } elsif( defined( $server_pid)) {
325 SERVER_LOOP: while (1) {
326 last SERVER_LOOP unless $sock = $listen->accept;
328 last SERVER_LOOP if /^quit/;