rfc:socket_getaddrinfo
Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
rfc:socket_getaddrinfo [2016/08/11 14:28] bp1222 |
rfc:socket_getaddrinfo [2017/09/22 13:28] (current) |
||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2016-08-08 | * Date: 2016-08-08 | ||
* Author: David Walker (dave@mudsite.com) | * Author: David Walker (dave@mudsite.com) | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | This RFC targets a reported feature request in [[https:// | + | This RFC targets a reported feature request in [[https:// |
- | ===== Proposals | + | ===== Proposal |
- | I'm starting this RFC with 3 proposed solutions, which are very similar, but I'm not sure which is preferable for implementation. | + | The implementation[[https:// |
- | ==== Proposal 1 ==== | + | |
- | The implementation[[https:// | + | |
<file php> | <file php> | ||
- | socket_getaddrinfo(string node[, mixed service, array hints]) : array | + | socket_addrinfo_lookup(string node[, mixed service, array hints]) : array |
socket_addrinfo_connect(resource $addrinfo) : resource | socket_addrinfo_connect(resource $addrinfo) : resource | ||
socket_addrinfo_bind(resource $addrinfo) : resource | socket_addrinfo_bind(resource $addrinfo) : resource | ||
- | socket_addrinfo(resource $addrinfo) : array | + | socket_addrinfo_explain(resource $addrinfo) : array |
- | socket_addrinfo_close(sockaddrresource sockaddr) : null | + | |
</ | </ | ||
+ | IPv4 Example | ||
<file php> | <file php> | ||
<?php | <?php | ||
- | $addrinfo = socket_getaddrinfo('127.0.0.1', 2000, array(' | + | $addrinfo = socket_addrinfo_lookup('localhost', 2000, array(' |
$sockaddr = reset($addrinfo); | $sockaddr = reset($addrinfo); | ||
if (!$sockaddr) die ("No Valid Socket Types" | if (!$sockaddr) die ("No Valid Socket Types" | ||
$sock = socket_addrinfo_bind($sockaddr); | $sock = socket_addrinfo_bind($sockaddr); | ||
// ^^ $sock is a socket resource that is bound to 127.0.0.1: | // ^^ $sock is a socket resource that is bound to 127.0.0.1: | ||
- | foreach | + | |
- | | + | var_dump(socket_addrinfo_explain($sockaddr)); |
+ | /* Outputs: | ||
+ | array(5) { | ||
+ | [" | ||
+ | int(0) | ||
+ | [" | ||
+ | int(2) | ||
+ | [" | ||
+ | int(1) | ||
+ | [" | ||
+ | int(6) | ||
+ | [" | ||
+ | array(2) { | ||
+ | [" | ||
+ | | ||
+ | [" | ||
+ | string(9) " | ||
+ | } | ||
} | } | ||
+ | */ | ||
</ | </ | ||
- | ==== Proposal 2 ==== | + | IPv6 Example |
- | This attempt [[https:// | + | |
- | + | ||
- | <file php> | + | |
- | socket_getaddrinfo(string $node[, mixed $service, array $hints]) : array | + | |
- | socket_connect(resource $sock_or_addr[, | + | |
- | socket_bind(resource $sock_or_addr[, | + | |
- | socket_addrinfo(resource $addrinfo) : array | + | |
- | socket_addrinfo_close(resourece $addrinfo) : null | + | |
- | </ | + | |
<file php> | <file php> | ||
<?php | <?php | ||
- | $addrinfo = socket_getaddrinfo('127.0.0.1', 2000, array(' | + | $addrinfo = socket_addrinfo_lookup('localhost', 2000, array(' |
$sockaddr = reset($addrinfo); | $sockaddr = reset($addrinfo); | ||
if (!$sockaddr) die ("No Valid Socket Types" | if (!$sockaddr) die ("No Valid Socket Types" | ||
- | $sock = socket_bind($sockaddr); | + | $sock = socket_addrinfo_bind($sockaddr); |
- | // ^^ $sock is a socket resource that is bound to 127.0.0.1:2000 using TCP/IP ready for reading | + | // ^^ $sock is a socket resource that is bound to [::1]:2000 using TCP/IP ready for reading |
- | foreach ($addrinfo as $sockaddr) { | + | |
- | socket_addrinfo_close($sockaddr); | + | |
- | } | + | |
- | </ | + | |
- | ==== Proposal 3 ==== | + | var_dump(socket_addrinfo_explain($sockaddr)); |
- | This attempt [[https:// | + | /* Outputs: |
- | + | array(5) { | |
- | <file php> | + | [" |
- | socket_getaddrinfo(string $node[, mixed $service, array $hints]) : array | + | int(0) |
- | socket_connect(resource $sock, mixed $address_or_addrinfo[, | + | [" |
- | socket_bind(resource $sock, string $address_or_addrinfo[, int port = 0]) : bool | + | int(10) |
- | socket_addrinfo_close(resourece $addrinfo) : null | + | |
- | </file> | + | int(1) |
- | + | [" | |
- | <file php> | + | int(6) |
- | <?php | + | ["ai_addr"]=> |
- | $addrinfo = socket_getaddrinfo(' | + | array(2) { |
- | $sockaddr = reset($addrinfo); | + | |
- | if (!$sockaddr) die ("No Valid Socket Types"); | + | int(2000) |
- | $sock = socket_create($sockaddr[' | + | |
- | $sock = socket_bind($sock, $sockaddr); | + | |
- | // ^^ $sock is a socket resource that is bound to 127.0.0.1: | + | } |
- | foreach | + | |
- | | + | |
} | } | ||
+ | */ | ||
</ | </ | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
- | New functionality; | + | New functionality; |
===== Proposed PHP Version(s) ===== | ===== Proposed PHP Version(s) ===== | ||
Line 97: | Line 98: | ||
==== New Constants ==== | ==== New Constants ==== | ||
Exposing the AI_* family of constants. | Exposing the AI_* family of constants. | ||
- | |||
- | ===== Open Issues ===== | ||
===== Proposed Voting Choices ===== | ===== Proposed Voting Choices ===== | ||
- | Vote to implement the new functions, would require a 2/3 majority. | + | Vote to implement the new functionality, would require a 2/3 majority. |
+ | <doodle title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
+ | Vote Start: 2016-08-24 15:23 UTC | ||
+ | |||
+ | Vote End: | ||
===== Implementation ===== | ===== Implementation ===== | ||
+ | |||
+ | - merged into master (i.e. pre 7.2) | ||
+ | - https:// | ||
+ | - https:// | ||
+ | - a link to the PHP manual entry for the feature | ||
===== References ===== | ===== References ===== | ||
- | * [1] - [[https:// | + | * [1] - [[https:// |
- | * [2] - [[https:// | + | |
- | * [3] - [[https:// | + |
rfc/socket_getaddrinfo.1470925683.txt.gz · Last modified: 2017/09/22 13:28 (external edit)