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

From: 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

« previous php.bugs (#203753) next »