diff --git a/nfl-apu.pl b/nfl-apu.pl index 4cb8b60..c26d479 100644 --- a/nfl-apu.pl +++ b/nfl-apu.pl @@ -1,6 +1,6 @@ #!perl -w use strict; -use Socket; +use IO::Socket; use Math::Trig qw(great_circle_distance deg2rad); use Net::SMTP; use Authen::SASL qw(Perl); @@ -8,7 +8,7 @@ use Authen::SASL qw(Perl); # auto-flush on socket $| = 1; -my $VERSION="0.1"; +my $VERSION="0.2"; print "NoForeignLand-AutomaticPositionUpdater $VERSION, by Frans Veldman s/v ZwerfCat (https://www.thefloatinglab.world)\n"; @@ -66,6 +66,7 @@ foreach my $a(@ARGV) { } next if($a=~/^-/); if($a=~/^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])):([0-9]+)$/) { + my $dummy=$5; # Dummy variable, somehow necessary for some obscure change of interpretation of $5. push @sockets,pack_sockaddr_in($5, inet_aton($1)); } else { die "Error: $a is not a valid IP:PORT address!\n"; @@ -250,16 +251,32 @@ sub gps_distance { sub sourceconnect { + my ($p,$i)=unpack_sockaddr_in($sockets[0]); + $i=inet_ntoa($i); + if($tcp) { # Connect for TCP source + print "Connecting... " if(!$daemon); - socket($sock, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die "socket: $!"; - setsockopt($sock, SOL_SOCKET, SO_KEEPALIVE, 1); - connect($sock,$sockets[0]) || die "Could not connect to TCP port!\n"; - print "Connected!\n" if(!$daemon); + $sock = new IO::Socket::INET ( + PeerAddr => $i, + PeerPort => $p, + Proto => 'tcp', + ReuseAddr => 1, + KeepAlive => 1, + BLocking => 1, + Type => SOCK_STREAM, + Sockopts => [ + [ SOL_SOCKET, SO_REUSEADDR ], + [ SOL_SOCKET, SO_KEEPALIVE ], + ] + ); + die "Could not create socket : $!\n" unless $sock; + print "Socket created: $sock\n" if(!$daemon); if($gpsd) { # Configure GPSD output, and skip config messages send($sock,'?WATCH={"enable":true,"json":false,"nmea":true,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}',0); +# print $sock,'?WATCH={"enable":true,"json":false,"nmea":true,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}'; while(my $line= <$sock>) { last unless($line=~/\{/); print $line if(!$daemon); @@ -267,10 +284,15 @@ sub sourceconnect { } } else { # Connect to UDP source - socket($sock, PF_INET, SOCK_DGRAM, getprotobyname('udp')) || die "socket: $!"; - setsockopt($sock, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!"; - setsockopt($sock,SOL_SOCKET,SO_RCVBUF,100000); - bind($sock, $sockets[0]) || die "bind: $!"; + + $sock = new IO::Socket::INET ( + LocalHost => $i, + LocalPort => $p, + Proto => 'udp', + ReuseAddr => 1, + ); + die "Could not create socket : $!\n" unless $sock; + print "Socket created: $sock\n" if(!$daemon); } }