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

From: Date: Fri, 12 Aug 2016 08:09:48 +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-203203@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:

I love this final version. Having $info['ai_addr'] be a resource is excellent. However I
suspect someone if not me will request to add a function that can take this resource and return the
IP address and port. Properly something to consider. Otherwise I am really happy with this version.


Previous Comments:
------------------------------------------------------------------------
[2016-08-11 03:15:57] dave at mudsite dot com

I see what you're looking for.  I've gone ahead and did a 3rd attempt at this guy with the
use of:

    $addrinfo = socket_getaddrinfo('127.0.0.1', 2000, array(
        'ai_family' => AF_INET,
        'ai_socktype' => SOCK_STREAM,
    ));

    echo "Server: Starting\n";

    $info = reset($addrinfo);
    $sock = socket_create($info['ai_family'], $info['ai_socktype'],
$info['ai_protocol']);
    if ($sock) {
        socket_bind($sock, $info['ai_addr']) or die("Could not bind");
        socket_listen($sock) or die("Could not listen");

$info['ai_addr'] here is a resource of the underlying sockaddr structure.  I foresee this
implementation a bit more contentious to advocate.  Due to the fact that socket_connect, and
socket_bind change signatures from

  socket_(connect/bind) (resource $sock, string $address[, int port])
to being
  socket_(connect/bind) (resource $sock, mixed $arg[, int port])
  where $arg can be string address where 3rd argument is used
  or
  where $args is resource of sockaddr and 3rd arg is ignored


I'll make sure to document all this for the RFC and see what everyone has to say about it.

------------------------------------------------------------------------
[2016-08-10 11:44:22] email at davekok dot nl

If at all possible I still like the array approach. As this allows the PHP programmer access to the
information within the addrinfo struct. Could socket_create, socket_bind and socket_listen not be
modified to also allow an array? I have no problem with having to also specify the socket resource
separately. Hiding this in a addrinfo resource seems wrong somehow.

If a resource is used instead of an array. Information functions to retrieve the information within
would be very much appreciated.

------------------------------------------------------------------------
[2016-08-10 11:35:26] email at davekok dot nl

I think it would be useful if the socket api remains as much as possible similar to how it is known
in other languages. So the second where socket_bind and socket_listen are used to receive a addrinfo
resource would be my preference.

Is there any reason to add a socket_addrinfo_close function. Can this not be garbage collected?

------------------------------------------------------------------------
[2016-08-10 03:11:58] dave at mudsite dot com

After playing around a bit I think the resource means is preferable.  I'm sure discussions on
the merits of both will be raised though RFC process[1].  I feel the resource method is superior
because it's the actual sockaddr structure behind it.  So if you do a
getaddrinfo("127.0.0.1", "ssh", NULL), the sockaddr structure already has into
it the correct port to use.  Whereas the addrinfo structure doesn't contain the port
you're looking for.  Your example uses $this->address["ai_addr"],
however, ai_addr isn't a port number like you're using it.  It's the sockaddr
structure.  So I envision the typical array-return to look weird like this:

<?php
$infos = socket_getaddrinfo('127.0.0.1', 'ssh', array(
    'ai_family' => AF_INET,
    'ai_socktype' => SOCK_STREAM
));
$info = reset($infos);
$sock = socket_create(
    $address["ai_family"],
    $address["ai_socktype"],
    $address["ai_protocol"]
);
socket_bind($sock, 22);


Whereas a resource based implementation could be:<?php
$infos = socket_getaddrinfo('127.0.0.1', 'ssh', array(
    'ai_family' => AF_INET,
    'ai_socktype' => SOCK_STREAM
));
$info = reset($infos);
$sock = socket_addrinfo_bind($info);


But I digress.

[1] - Draft RFC: https://wiki.php.net/rfc/socket_getaddrinfo

------------------------------------------------------------------------
[2016-08-08 15:41:09] email at davekok dot nl

I would indeed prefer an array to be returned rather then a resource with a additional functions.
Otherwise great work!!

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


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=72733


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


Thread (14 messages)

« previous php.bugs (#203203) next »