Its worth noting that if your trying to bind a port for ipv6, you need to use "::0" if you wish to bind all interfaces, for example:
$sock = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
$err = socket_bind($sock, "::0", 34000);
Would bind ipv6 udp port 34000 on all interfaces.
socket_bind
(PHP 4 >= 4.1.0, PHP 5)
socket_bind — Soketi bir isimle ilişkilendirir
Açıklama
$soket
, string $adres
[, int $port = 0
] )
Belirtilen socket'i
adres'teki bir isimle ilişkilendirir. Bu işlem,
socket_connect() veya
socket_listen() işlevlerini kullanarak bir bağlantı
oluşturulmadan önce yapılmalıdır.
Değiştirgeler
-
soket -
socket_create() ile oluşturulmuş geçerli bir soket özkaynağı.
-
address -
Soket,
AF_INETtüründeyse noktalı dördül gösterimle (127.0.0.1 gibi) geçerli bir IPv4 adresi,AF_INET6türündeyse ve IPv6 desteği varsa geçerli bir IPv6 adresi (::1 gibi) olmalıdır.Soket,
AF_UNIXtüründeyse Unix ailesinden bir soketin dosya yolu (/var/run/daemon.sock gibi) olmalıdır. -
port(seçimlik) -
Bu değiştirge sadece ve zorunlu olarak bir
AF_INETveyaAF_INET6sokete bağlanırken gerekir ve bağlantının yapılacağı uzak konak üzerinde bir port belirtir.
Dönen Değerler
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Hata kodu socket_last_error() işlevi ile alınabilir. Bu hata kodunu socket_strerror() işlevine aktararak hatayı açıklayan dizgeyi alabilirsiniz.
Örnekler
Örnek 1 - Kaynak adresini belirtmek için socket_bind() kullanımı
<?php
// Yeni bir soket oluşturalım
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// IP adreslerini makine sahibine göre tanımlayalım
$sourceips['kevin'] = '127.0.0.1';
$sourceips['madcoder'] = '127.0.0.2';
// Soketi kaynak adresiyle ilişkilendirelim
socket_bind($sock, $sourceips['madcoder']);
// Hedef adrese bağlanalım
socket_connect($sock, '127.0.0.1', 80);
// Veriyi gönderelim
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n";
socket_write($sock, $request);
// Soketi kapatalım
socket_close($sock);
?>
Notlar
Bilginize:
Bu işlev socket_connect() işlevinden önce çağrılmalıdır.
Bilginize: Windows 9x/ME uyumluluk bilgisi:
Soketi makinenize ait olmayan bir adresle ilişkilendirmeye çalışırsanız socket_last_error() işlevi geçersiz bir hata kodu döndürebilir.
Ayrıca Bakınız
- socket_connect() - Soket üzerinde bir bağlantıyı ilklendirir
- socket_listen() - Bir soketi bağlantı kabul etmek için dinler
- socket_create() - Bir soket oluşturur (iletişim için bir uç)
- socket_last_error() - Soket üzerindeki son hatanın kodunu döndürür
- socket_strerror() - Bir soket hatasıyla ilgili açıklamayı döndürür
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
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)
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.
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.
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!
