PHP Conference Japan 2024

socket_bind

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_bind将名称绑定到套接字

描述

socket_bind(Socket $socket, string $address, int $port = 0): bool

address中给定的名称绑定到socket描述的套接字。在使用socket_connect()socket_listen()建立连接之前,必须执行此操作。

参数

socket

使用socket_create()创建的Socket实例。

address

如果套接字属于AF_INET族,则address是以点分四元组表示法的IP(例如127.0.0.1)。

如果套接字属于AF_UNIX族,则address是Unix域套接字的路径(例如/tmp/my.sock)。

port (可选)

只有在绑定AF_INET套接字时才使用port参数,它指定侦听连接的端口。

返回值

成功返回true,失败返回false

可以使用socket_last_error()检索错误代码。此代码可以传递给socket_strerror()以获取错误的文本解释。

变更日志

版本 描述
8.0.0 socket现在是Socket实例;以前,它是一个resource

示例

示例 #1 使用socket_bind()设置源地址

<?php
// 创建一个新的套接字
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 计算机拥有的IP地址示例列表
$sourceips['kevin'] = '127.0.0.1';
$sourceips['madcoder'] = '127.0.0.2';

// 绑定源地址
socket_bind($sock, $sourceips['madcoder']);

// 连接到目标地址
socket_connect($sock, '127.0.0.1', 80);

// 写入
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n";
socket_write($sock, $request);

// 关闭
socket_close($sock);

?>

注释

注意:

此函数必须在socket_connect()之前在套接字上使用。

参见

添加注释

用户贡献的注释 6 条注释

keksov[at]gmx.de
22 年前
如果要重用地址和端口,并消除错误:无法绑定,地址已在使用中,则必须在调用 bind 之前使用 socket_setopt(检查 PHP 版本中此函数的实际拼写)。

<?php
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo
socket_strerror(socket_last_error($sock));
exit;
}
?>

此解决方案由
Christophe Dirac 发现。感谢 Christophe!
dresende at thinkdigital dot pt
13 年前
关于之前的帖子

"0" 的地址与 "0.0.0.0" 没有区别

127.0.0.1 -> 只接受来自本地主机的连接
w.x.y.z(有效的本地 IP)-> 只接受来自此网络的连接
0.0.0.0 -> 接受来自任何地方的连接
php50613160534 dot 3 dot korkman at spamgourmet dot org
19 年前
使用 0 作为端口来绑定一个随机的(空闲的)端口以用于传入连接

socket_bind ($socket, $bind_address, 0);
socket_getsockname($socket, $socket_address, $socket_port);
socket_listen($socket);
...

$socket_port 包含已分配的端口,您可能需要将其发送给连接的远程客户端。已在 php 5.03 中测试。
ealexs at gmail dot com
2 年前
我发布这个是因为我花了几个小时调试它。

如果您使用 socket_create / socket_bind 与 Unix 域套接字,那么在最后使用 socket_close 是不够的。第二次运行脚本时,您将收到“地址已在使用中”错误。在开始创建套接字之前,最好在用于 Unix 域套接字的文件上调用 unlink。

<?php

$socket_file
= "./test.sock";

if (
file_exists($socket_file))
unlink($socket_file);
# 可选文件锁
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
# ... socket_set_option ...
socket_bind($socket, $socket_file);
# ...
socket_close($socket);
# 可选:释放锁
unlink($socket_file);

?>
gasket at cekkent dot net
21 年前
关于使用 NULL 绑定到所有地址的上述技巧对我不起作用,因为我会收到关于未知地址的错误。使用 0 对我有用

socket_bind ($socket, 0, $port)

这也允许您接收 UDP 广播,这正是我一直在努力弄清楚的事情。
gabriel at plenitech dot fr
11年前
在使用Unix套接字时,可能需要更改套接字文件的权限(chmod),以便赋予组和/或其他人写入权限。否则,只有所有者才能向流中写入数据。

示例

<?php
$sockpath
= '/tmp/my.sock';
socket_bind($socket, $sockpath);
//此处:其他人只有写入权限 (socket_send),只有所有者可以读取数据。
chmod($sockpath, 0702);
?>
To Top