©
This document uses PHP Chinese website manual Release
(PHP 4 >= 4.1.0, PHP 5)
socket_bind — 给套接字绑定名字
$socket
, string $address
[, int $port
= 0
] )
绑定 address
到 socket
。
该操作必须是在使用 socket_connect() 或者 socket_listen()
建立一个连接之前。
socket
用 socket_create() 创建的一个有效的套接字资源。
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() 则可以得到错误的文字说明。
Example #1 使用 socket_bind() 来设置套接字资源地址
<?php
// Create a new socket
$sock = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP );
// An example list of IP addresses owned by the computer
$sourceips [ 'kevin' ] = '127.0.0.1' ;
$sourceips [ 'madcoder' ] = '127.0.0.2' ;
// Bind the source address
socket_bind ( $sock , $sourceips [ 'madcoder' ]);
// Connect to destination address
socket_connect ( $sock , '127.0.0.1' , 80 );
// Write
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n" ;
socket_write ( $sock , $request );
// Close
socket_close ( $sock );
?>
Note:
该函数必须在 socket_connect() 之前使用。
Note:
Windows 9x/ME 兼容性注意点: 如果尝试绑定套接字资源到一个错误的地址,而这个地址不是本机的地址,那么 socket_last_error() 可能会返回一个无效的错误代码。
[#1] gabriel at plenitech dot fr [2013-06-23 12:29:48]
When doing Unix sockets, it might be necessary to chmod the socket file so as to give Write permission to Group and/or Others. Otherwise, only the owner is allowed to write data into the stream.
Example:
<?php
$sockpath = '/tmp/my.sock';
socket_bind($socket, $sockpath);
//here: write-only (socket_send) to others, only owner can fetch data.
chmod($sockpath, 0702);
?>
[#2] dresende at thinkdigital dot pt [2011-11-21 09:39:21]
Regarding previous post:
"0" has address is no different from "0.0.0.0"
127.0.0.1 -> accept only from local host
w.x.y.z (valid local IP) -> accep only from this network
0.0.0.0 -> accept from anywhere
[#3] Mex [2011-09-13 17:25:40]
It appears for the $address parameter:
'127.0.0.1'
accepts clients from localhost (eg. 127.0.0.1)
'0.0.0.0'
accepts clients from localhost, and the server's network (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40)
'0' or 0
accepts clients from localhost, the server's network, and external networks (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40, 209.85.169.99)
[#4] php50613160534 dot 3 dot korkman at spamgourmet dot org [2005-06-13 06:16:16]
Use 0 for port to bind a random (free) port for incoming connections:
socket_bind ($socket, $bind_address, 0);
socket_getsockname($socket, $socket_address, $socket_port);
socket_listen($socket);
...
$socket_port contains the assigned port, you might want to send it to a remote client connecting. Tested with php 5.03.
[#5] gasket at cekkent dot net [2003-05-03 18:19:17]
The aforementioned tidbit about using NULL to bind to all addresses did not work for me, as I would receive an error about unknown address. Using a 0 worked for me:
socket_bind ($socket, 0, $port)
This also allows you to receive UDP broadcasts, which is what I had been trying to figure out.
[#6] keksov[at]gmx.de [2002-06-10 11:22:22]
If you want to reuse address and port, and get rid of error: unable to bind, address already in use, you have to use socket_setopt (check actual spelling for this function in you PHP verison) before calling bind:
<?php
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo socket_strerror(socket_last_error($sock));
exit;
}
?>
This solution was found by
Christophe Dirac. Thank you Christophe!