socket_recvfrom

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

socket_recvfromBağlantılı olsun olmasın bir soketten veri alır

Açıklama

socket_recvfrom ( resource $soket , string &$tmmpon , int $uzunluk , int $seçenekler , string &$isim [, int &$port ] ) : int

socket_recvfrom() işlevi belirtilen soket üzerinden tampon tamponundan uzunluk baytlık veriyi port. porttaki isim'den alır. İşlev bağlantılı (tcp) ve bağlantısız (udp) soketlerle çalışabilir. Ayrıca, bazı seçeneklerle işlevin davranışında değişiklik yapılabilir.

isim ve port gönderimli aktarılmalıdır. Soket bağlantı yönelimli değilse isim değiştirgesine uzak konağın IP adresi veya Unix soketinin dosya yolu atanacaktır. Soketin bağlantı yönelimli olması durumunda isim NULL'dur. Bunun yanında, soketin bir bağlantısız AF_INET veya AF_INET6 soket olması durumunda port uzak konağın port numarasını içerecektir.

Değiştirgeler

soket

socket_create() ile oluşturulmuş geçerli bir soket özkaynağı.

tampon

Alınan verinin yerleştirileceği tampon.

uzunluk

Uzak konaktan alınacak azami bayt sayısı.

seçenekler

Aşağıdaki değerlerin bitsel VEYAlanmış (|) bir birleşimi olabilir

Olası seçenekler
Seçenek Açıklama
MSG_OOB Band dışı veri işlenir.
MSG_PEEK Veri alım kuyruğunun başlangıcından alınırken kuyruktan silinmez.
MSG_WAITALL uzunluk bayt alınıncaya kadar soket baskılanır. Ancak, bir sinyal alınırsa veya uzak konak bağlantıyı keserse işlev daha az veriyle dönebilir.
MSG_DONTWAIT İşlev bekleme kipinde olsa bile bu seçenek işlevin beklemeden dönmesine sebep olur.
isim

Soket AF_UNIX türündeyse dosya yolu, bağlantısız soketse uzak konağın IP adresi, bağlantı yönelimli bir soketse NULL'dur.

port

Sadece AF_INET ve AF_INET6 soketlere uygulanır ve verinin alındığı uzak portu belirtir. Soket bağlantı yönelimli ise port NULL olacaktır.

Dönen Değerler

socket_recvfrom() işlevi alınan bayt sayısını döndürür. Bir hata oluşmuşsa 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 - socket_recvfrom() örneği

<?php
error_reporting
(E_ALL E_STRICT);

$socket socket_create(AF_INETSOCK_DGRAMSOL_UDP);
socket_bind($socket'127.0.0.1'1223);

$from '';
$port 0;
socket_recvfrom($socket$buf120$from$port);

echo 
"$from adresinin $port. portundan $buf bayt alındı" PHP_EOL;
?>

Bu örnek 127.0.0.1 adresindeki 1223. port üzerinde bir UDP portu oluşturup uzak konaktan alınacak 12 bayta kadar veriyi gösterir.

Sürüm Bilgisi

Sürüm: Açıklama
4.3.0 socket_recvfrom() artık ikil olarak güvenli.

Ayrıca Bakınız

add a note add a note

User Contributed Notes 5 notes

up
4
lorin dot weilenmann at gmail dot com
4 years ago
If you use socket_recvfrom on a UDP socket and combine it with the MSG_DONTWAIT flag, it will raise a PHP Warning if there is nothing to read. AFAIK, there is no way around that warning except suppressing it with @ (i.e. you cannot check if there is data before calling socket_recvfrom).
up
0
davide dot renzi at gmail dot com
8 years ago
Pay attention! On some PHP version the MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)
up
-1
ply2attoetensen-project.com
3 years ago
MSG_DONTWAIT doesn't seem to exist in windows sockets. However socket_set_nonblock() seems to do the trick.
up
-2
jaggerwang at gmail dot com
12 years ago
I'm confused about the rerturn value of socket_recvfrom(), it said -1 when failed, but when I call like this:

if (($len = @socket_recvfrom($sock, $result, 32, 0, $ip, $port)) == -1) {
    if ($this->_debug) {
        echo "socket_read() failed: " . socket_strerror(socket_last_error()) . "\n";
    }
    return false;
}

variable $len = false, when I change the buffer length from 32 to 4096, it becomes right.
up
-10
ryan_at_ryanfisher_dot_com
13 years ago
DNS RELAY USING UDP SOCKETS

<?php

while(TRUE) {
  
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
   if(
$socket === FALSE)
   {
       echo
'Socket_create failed: '.socket_strerror(socket_last_error())."\n";
   }
   if(!
socket_bind($socketD, "0.0.0.0", 53)) {
      
socket_close($socketD);
       echo
'socket_bind failed: '.socket_strerror(socket_last_error())."\n";
   }
  
socket_recvfrom($socket,$buf,65535,0,$clientIP,$clientPort);
  
$stz = bin2hex($buf);
  
$tx = "";
   for(
$i=0;$i<(strlen($stz)-26-10)/2;$i++)
   {
    
$e = "00";
    
$e[0] = $stz[$i*2+26];
    
$e[1] = $stz[$i*2+27];
    
$f = hexdec($e);
     if(
$f > 0 && $f < 32) $tx .= "."; else
    
$tx .= sprintf("%c",$f);
   }
   echo
"$clientIP <".$tx.">\n";                                           
  
$fp = fsockopen("udp://72.174.110.4",53,$errno,$errstr);
   if (!
$fp)
   {
       echo
"ERROR: $errno - $errstr<br />\n";
   }
   else
   {
     
fwrite($fp,$buf);
     
$ret = $buf;
     
$ret = fread($fp,667);
     
fclose($fp);
   }
  }
socket_send($socket,$ret,667,0);
}
?>
To Top