Req #72733 [Opn->Csd]: It would be nice to have something like getaddrinfo.
| From: | cmb@php.net | Date: | Fri, 02 Sep 2016 18:13:42 +0000 |
| Subject: | Req #72733 [Opn->Csd]: It would be nice to have something like getaddrinfo. | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-203753@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
Updated by: cmb@php.net
Reported by: email at davekok dot nl
Summary: It would be nice to have something like getaddrinfo.
-Status: Open
+Status: Closed
Type: Feature/Change Request
Package: Sockets related
Operating System: Any
PHP Version: 7.0.9
Block user comment: N
Private report: N
New Comment:
Automatic comment on behalf of dave@mudsite.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=7373ce914914e9a434216554a7e29aa4d1775d97
Log: Fix #72733: Expose getaddrinfo C function, and supporting connect/bind
Previous Comments:
------------------------------------------------------------------------
[2016-08-12 08:09:43] email at davekok dot nl
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.
------------------------------------------------------------------------
[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
------------------------------------------------------------------------
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