Socket getsockname: примеры (PHP)
socket_getsockname(resource socket, string &address [, int &port]): boolОписание socket_getsockname
Функция socket_getsockname в PHP получает информацию о локальной стороне установленного сокетного соединения. Её применяют для определения IP-адреса и порта, назначенных системе при работе с сетевыми соединениями.
- socket (обязательный) - ресурс сокета, созданный socket_create().
- address (обязательный) - ссылка на переменную, в которую запишется IP-адрес или Unix-сокет путь.
- port (опциональный) - ссылка на переменную для номера порта (используется только для AF_INET и AF_INET6).
Примеры применения
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 0);
socket_listen($socket);
socket_getsockname($socket, $addr, $port);
echo "Сервер слушает: $addr:$port";
?>Сервер слушает: 127.0.0.1:56789
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 0);
if(socket_getsockname($socket, $addr, $port)) {
echo "Адрес: $addr, Порт: $port";
}
?>Адрес: 0.0.0.0, Порт: 49152
Альтернативы в PHP
Получает информацию об удаленной стороне соединения. Используется, когда требуется узнать адрес клиента.
Работает с потоковыми сокетами, созданными через stream_socket. Предоставляет аналогичную функциональность.
socket_getsockname применяют для низкоуровневых сокетов, а stream_socket_get_name - для потоков в стиле PHP.
Аналоги в других языках
Socket getsockname в Python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 0))
addr, port = sock.getsockname()
print(f'{addr}:{port}')127.0.0.1:65432
const net = require('net');
const server = net.createServer();
server.listen(0, '127.0.0.1');
server.on('listening', () => {
const addr = server.address();
console.log(`${addr.address}:${addr.port}`);
});127.0.0.1:56789
В Python и JavaScript методы встроены в объекты сокетов, а в PHP требуется отдельный вызов функции.
Типичные ошибки
<?php
$addr = '';
socket_getsockname(false, $addr);
?>Warning: socket_getsockname() expects parameter 1 to be resource, bool given
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_getsockname($socket, $addr, $port);
?>Warning: socket_getsockname(): unable to fetch socket name
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_getsockname($socket, null);
?>Warning: socket_getsockname() expects parameter 2 to be string, null given
Изменения в PHP
В PHP 8.0 функция теперь выбрасывает ValueError при некорректных аргументах вместо генерации предупреждений. С PHP 8.0 параметры address и port всегда передаются по ссылке.
Расширенные примеры
<?php
$socket = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '::', 0);
socket_getsockname($socket, $addr, $port);
$ipv4 = socket_getsockname($socket, $addr);
echo "IPv6: $addr:$port\n";
?>IPv6: :: 34567
<?php
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($socket, '/tmp/test.sock');
socket_getsockname($socket, $path);
echo "Путь: $path";
?>Путь: /tmp/test.sock
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'example.com', 80);
socket_getsockname($socket, $local_ip, $local_port);
echo "Локальный адрес подключения: $local_ip:$local_port";
?>Локальный адрес подключения: 192.168.1.5:49210
<?php
$sockets = [];
foreach(['0.0.0.0', '127.0.0.1'] as $bind_addr) {
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $bind_addr, 0);
socket_getsockname($sock, $addr, $port);
$sockets[] = [$addr, $port];
}
print_r($sockets);
?>Array
(
[0] => Array
(
[0] => 0.0.0.0
[1] => 49153
)
[1] => Array
(
[0] => 127.0.0.1
[1] => 49154
)
)