Req #72733 [Opn]: It would be nice to have something like getaddrinfo.

From: Date: Sun, 07 Aug 2016 07:19:16 +0000
Subject: Req #72733 [Opn]: It would be nice to have something like getaddrinfo.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-203023@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72733&edit=1

 ID:                 72733
 User updated by:    email at davekok dot nl
 Reported by:        email at davekok dot nl
 Summary:            It would be nice to have something like getaddrinfo.
 Status:             Open
 Type:               Feature/Change Request
 Package:            Sockets related
 Operating System:   Any
 PHP Version:        7.0.9
 Block user comment: N
 Private report:     N

 New Comment:

Oh perhaps it would have been a better example if the socket type hint would also by in the
constructor.


Previous Comments:
------------------------------------------------------------------------
[2016-08-07 07:02:27] email at davekok dot nl

That is indeed the point. Mostly I only have a hostname, not an IP address and knowing whether a
hostname supports or requires IPv6 is hard to find out. It requires you to do your own DNS queries.
There is no gethostbyname for IPv6 in PHP.

A simple socket wrapper could look something like this with getaddrinfo.

  <?php

  class Socket {
    private $address;
    private $socket;

    public function __construct(string $host, string $service) {
      $addresses = socket_addrinfo($host, $service, [
        "ai_family"=>PF_UNSPEC,
        "ai_socktype"=>SOCK_STREAM
      ]);
      if ($addresses === false) throw new Exception("host not found");
      $this->address = reset($addresses);
      $this->socket = socket_create(
        $address["ai_family"],
        $address["ai_socktype"],
        $address["ai_protocol"]
      );
      if (!$this->socket) throw new Exception("error creating socket");
    }

    public function bind() {
      socket_bind($this->socket, $this->address["ai_addr"]);
    }

    public function listen(int $backlog = 0) {
      socket_listen($this->socket, $backlog);
    }

    public function connect() {
      socket_connect($this->socket, $this->address["ai_addr"]);
    }

    // other socket stuff
  }

As an additional benefit you don't even need to know the port number you can just use the
service name.

------------------------------------------------------------------------
[2016-08-07 04:12:58] kalle@php.net

Could you expand your idea with some code examples of what you do now and how you propose a solution
to visualize this some more?

------------------------------------------------------------------------
[2016-08-03 23:06:35] dave at mudsite dot com

I'm not certain I'm following what is hard about supporting both.  socket_create()'s
first argument allows you to choose to have this socket be an AF_INET or AF_INET6.  Unless
you're attempting to pull information about a host wherein you can get all addresses about a
host for a specific purpose a-la: http://www.logix.cz/michal/devel/various/getaddrinfo.c.xp

------------------------------------------------------------------------
[2016-08-02 13:28:56] email at davekok dot nl

Description:
------------
Currently it is rather hard to support both IPv4 and IPv6 in PHP when using sockets. It would be
rather nice if getaddrinfo system function would be available to PHP scripts. If have yet to find a
alternative for PHP that works just as clean.



------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=72733&edit=1


Thread (14 messages)

« previous php.bugs (#203023) next »