1#!/usr/bin/perl 2 3use strict; 4use warnings; 5 6use Test::More; 7 8use IO::Socket::IP; 9 10use Errno qw( EACCES ); 11use Socket qw( SOL_SOCKET SO_REUSEADDR SO_REUSEPORT SO_BROADCAST ); 12 13TODO: { 14 local $TODO = "SO_REUSEADDR doesn't appear to work on cygwin smokers" if $^O eq "cygwin"; 15 # I honestly have no idea why this fails, and people don't seem to be able 16 # to reproduce it on a development box. I'll mark it TODO for now until we 17 # can gain any more insight into it. 18 19 my $sock = IO::Socket::IP->new( 20 LocalHost => "127.0.0.1", 21 Type => SOCK_STREAM, 22 Listen => 1, 23 ReuseAddr => 1, 24 ) or die "Cannot socket() - $@"; 25 26 ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEADDR ), 'SO_REUSEADDR set' ); 27} 28 29SKIP: { 30 # Some OSes don't implement SO_REUSEPORT 31 skip "No SO_REUSEPORT constant", 1 unless defined eval { SO_REUSEPORT }; 32 skip "No support for SO_REUSEPORT", 1 unless defined eval { 33 my $s; 34 socket( $s, Socket::PF_INET, Socket::SOCK_STREAM, 0 ) and 35 setsockopt( $s, SOL_SOCKET, SO_REUSEPORT, 1 ) }; 36 37 my $sock = IO::Socket::IP->new( 38 LocalHost => "127.0.0.1", 39 Type => SOCK_STREAM, 40 Listen => 1, 41 ReusePort => 1, 42 ) or die "Cannot socket() - $@"; 43 44 ok( $sock->getsockopt( SOL_SOCKET, SO_REUSEPORT ), 'SO_REUSEPORT set' ); 45} 46 47SKIP: { 48 # Some OSes need special privileges to set SO_BROADCAST 49 $! = 0; 50 my $sock = IO::Socket::IP->new( 51 LocalHost => "127.0.0.1", 52 Type => SOCK_DGRAM, 53 Broadcast => 1, 54 ); 55 skip "Privileges required to set broadcast on datagram socket", 1 if !$sock and $! == EACCES; 56 die "Cannot socket() - $@" unless $sock; 57 58 ok( $sock->getsockopt( SOL_SOCKET, SO_BROADCAST ), 'SO_BROADCAST set' ); 59} 60 61done_testing; 62