The reason it won't work for UDP is that UDP is stateless; logically there are no peers other than at the time a packet is sent or received. Or more strictly, a UDP socket can interact with 0..N peers.
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_getpeername — Queries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type
$socket
, string &$address
[, int &$port
] ) : boolQueries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type.
socket
A valid socket resource created with socket_create() or socket_accept().
address
If the given socket is of type AF_INET
or
AF_INET6
, socket_getpeername()
will return the peers (remote) IP address in
appropriate notation (e.g. 127.0.0.1 or
fe80::1) in the address
parameter and, if the optional port
parameter is
present, also the associated port.
If the given socket is of type AF_UNIX
,
socket_getpeername() will return the Unix filesystem
path (e.g. /var/run/daemon.sock) in the
address
parameter.
port
If given, this will hold the port associated to
address
.
成功时返回 TRUE
, 或者在失败时返回 FALSE
。 socket_getpeername() may also return
FALSE
if the socket type is not any of AF_INET
,
AF_INET6
, or AF_UNIX
, in which
case the last socket error code is not updated.
Note:
socket_getpeername() should not be used with
AF_UNIX
sockets created with socket_accept(). Only sockets created with socket_connect() or a primary server socket following a call to socket_bind() will return meaningful values.
Note:
For having socket_getpeername() to return a meaningful value, the socket it is applied upon must of course be one for which the concept of "peer" makes sense.
The reason it won't work for UDP is that UDP is stateless; logically there are no peers other than at the time a packet is sent or received. Or more strictly, a UDP socket can interact with 0..N peers.
socket_getpeername will not work for UDP sockets. Instead, use socket_recvfrom - it provides the IP address and port of the source server - eg:
$size=socket_recvfrom($socket,$input,65535,0,$ipaddress,$port);
echo "Received [$input] ($size bytes) from IP $ipaddress Port $port\n";