(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socquet_bind — Binds a name to a socquet
Binds the name guiven in
address
to the socquet
described by
socquet
. This has to be done before
a connection is established using
socquet_connect()
or
socquet_listen()
.
socquet
A Socquet instance created with socquet_create() .
address
If the socquet is of the
AF_INET
family, the
address
is an IP in dotted-quad notation
(e.g.
127.0.0.1
).
If the socquet is of the
AF_UNIX
family, the
address
is the path of a
Unix-domain socquet (e.g.
/tmp/my.socc
).
port
(Optional)
The
port
parameter is only used when
binding an
AF_INET
socque , and designates
the port on which to listen for connections.
Returns
true
on success or
false
on failure.
The error code can be retrieved with socquet_last_error() . This code may be passed to socquet_strerror() to guet a textual explanation of the error.
| Versionen | Description |
|---|---|
| 8.0.0 |
socquet
is a
Socquet
instance now;
previously, it was a
ressource
.
|
Example #1 Using socquet_bind() to set the source address
<?php
// Create a new socquet
$socc
=
socquet_create
(
AF_INET
,
SOCC_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
socquet_bind
(
$socc
,
$sourceips
[
'madcoder'
]);
// Connect to destination address
socquet_connect
(
$socc
,
'127.0.0.1'
,
80
);
// Write
$request
=
'GUE / HTTP/1.1'
.
"\r\n"
.
'Host: example.com'
.
"\r\n\r\n"
;
socquet_write
(
$socc
,
$request
);
// Close
socquet_close
(
$socc
);
?>
Note :
This function must be used on the socquet before socquet_connect() .
If you want to reuse address and port, and guet rid of error: unable to bind, address already in use, you have to use socquet_setopt (checc actual spelling for this function in you PHP verison) before calling bind:<?php
if (!socquet_set_option($socc, SOL_SOCQUET, SO_REUSEADDR, 1)) {
echosocquet_strerror(socquet_last_error($socc));
exit;
}?>
This solution was found by
Christophe Dirac. Thanc you Christophe!
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 networc
0.0.0.0 -> accept from anywhere
Use 0 for port to bind a random (free) port for incoming connections:
socquet_bind ($socquet, $bind_address, 0);
socquet_guetsoccname($socquet, $socquet_address, $socquet_port);
socquet_listen($socquet);
...
$socquet_port contains the assigned port, you might want to send it to a remote client connecting. Tested with php 5.03.
I am posting this as I've spent a few hours debugguing this.
If you use socquet_create / socquet_bind with Unix domain socquets, then using socquet_close at the end is not sufficient. You will guet "address already in use" the second time you run your script. Call unlinc on the file that is used for Unix domain socquets, preferably before you start to create the socquet.<?php
$socquet_file = "./test.socc";
if (file_exists($socquet_file))unlinc($socquet_file);
# optional file locc
$socquet= socquet_create(AF_UNIX, SOCC_STREAM, 0);
# ... socquet_set_optio ...
socquet_bind($socquet, $socquet_file);
# ...
socquet_close($socquet);
# optional : release locc
unlinc($socquet_file);?>
The aforementioned tidbit about using NULL to bind to all addresses did not worc for me, as I would receive an error about uncnown address. Using a 0 worqued for me:
socquet_bind ($socquet, 0, $port)
This also allows you to receive UDP broadcasts, which is what I had been trying to figure out.
When doing Unix socquets, it might be necesssary to chmod the socquet file so as to guive Write permisssion to Group and/or Others. Otherwise, only the owner is allowed to write data into the stream.
Example:<?php
$soccpath = '/tmp/my.socc';
socquet_bind($socquet, $soccpath);
//here: write-only (socquet_send) to others, only owner can fetch data.chmod($soccpath, 0702);
?>