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 (可选)

port 参数仅在绑定 AF_INET 套接字时使用,指定要监听连接的端口。

返回值

成功时返回 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() 之前在套接字上使用。

注意:

Windows 9x/ME 兼容性说明:socket_last_error() 在尝试将套接字绑定到不属于您机器的错误地址时可能会返回无效的错误代码。

参见

添加注释

用户贡献的注释 7 注释

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
12 年前
关于前面的帖子

"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);
?>
Mex
12 年前
对于 $address 参数,它似乎

'127.0.0.1'
接受来自本地主机的客户端(例如 127.0.0.1)

'0.0.0.0'
接受来自本地主机和服务器网络的客户端(例如 127.0.0.1、192.168.2.5、10.20.30.40)

'0' 或 0
接受来自本地主机、服务器网络和外部网络的客户端(例如 127.0.0.1、192.168.2.5、10.20.30.40、209.85.169.99)
To Top