ProbePort.pm 850 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package Selenium::CanStartBinary::ProbePort;
  2. use strict;
  3. use warnings;
  4. # ABSTRACT: Utility functions for finding open ports to eventually bind to
  5. use IO::Socket::INET;
  6. use Selenium::Waiter qw/wait_until/;
  7. require Exporter;
  8. our @ISA = qw/Exporter/;
  9. our @EXPORT_OK = qw/find_open_port_above find_open_port probe_port/;
  10. =for Pod::Coverage *EVERYTHING*
  11. =cut
  12. sub find_open_port_above {
  13. socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname("tcp"));
  14. bind(SOCK, sockaddr_in(0, INADDR_ANY));
  15. my $port = (sockaddr_in(getsockname(SOCK)))[0];
  16. close(SOCK);
  17. return $port;
  18. }
  19. sub find_open_port {
  20. my ($port) = @_;
  21. probe_port($port) ? return 0 : return $port;
  22. }
  23. sub probe_port {
  24. my ($port) = @_;
  25. return IO::Socket::INET->new(
  26. PeerAddr => '127.0.0.1',
  27. PeerPort => $port,
  28. Timeout => 3
  29. );
  30. }