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

From: Date: Thu, 11 Aug 2016 03:15:58 +0000
Subject: Req #72733 [Com]: It would be nice to have something like getaddrinfo.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-203187@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
 Comment by:         dave at mudsite dot com
 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 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.


Previous Comments:
------------------------------------------------------------------------
[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!!

------------------------------------------------------------------------
[2016-08-07 19:41:00] dave at mudsite dot com

I took a stab at
this(https://github.com/bp1222/php-src/commit/785284cdbc8a46d7c1b07567bb0d06d348112684). 
implementing a 

array socket_getaddrinfo(string $node, mixed $service[, array $hints])

This attempt returns an array of resources, each resource being a C addrinfo struct.  To use, I just
made a socket_addrinfo_connect and socket_addrinfo_bind to accept the resource to connect/bind.

Although in your desired example, you'd want to just have an array of info from addrinfo
returned, and you call create&connect/bind with returned variables.

Not sure if one would be preferable over the other, I would assume implementing your use would be
better as it wouldn't require resources & would be a couple less functions declared.

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


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 (#203187) next »