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).socket_recvfrom
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
socket_recvfrom
Референца за `function.socket-recvfrom.php` со подобрена типографија и навигација.
socket_recvfrom
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_recvfrom — Прима податоци од сокет, без разлика дали е поврзан или не
= NULL
Сокет
$socket,string
&$data,int
$length,int
$flags,string
&$address,int
&$port = null): int|false
На socket_recvfrom() функцијата прима
length бајти податоци во data from
address на порта port (ако сокетот не е од тип AF_UNIX) користејќи
socket. socket_recvfrom() може да се користи за собирање податоци од поврзани и неповрзани сокети. Дополнително, може да се специфицираат една или повеќе знаменца за модифицирање на однесувањето на функцијата.
На address and port мора да се предаде по референца. Ако сокетот не е поврзан,
address ќе биде поставено на интернет протокол адресата на далечинскиот домаќин или патеката до UNIX сокетот. Ако сокетот е поврзан, address is null. Дополнително, port ќе ја содржи портата на далечинскиот домаќин во случај на неповрзан AF_INET or
AF_INET6 socket.
Забелешка: Пример #4 Користење на контексти на потоци
Параметри
socket-
На
socketмора да биде Сокет инстанца претходно креирана со socket_create(). data-
Примените податоци ќе бидат преземени во променливата специфицирана со
data. length-
До
lengthбајти ќе бидат преземени од далечинскиот домаќин. flags-
Вредноста на
flagsможе да биде која било комбинација од следниве знамиња, споени со бинарниот ИЛИ (|) оператор.се однесува на низа од вредности на атрибутот релевантни за модификацијата. flagsЗнаменце = NULL MSG_OOBОбработи податоци надвор од опсегот. MSG_PEEKПрими податоци од почетокот на редот за прием без да ги отстраниш од редот. MSG_WAITALLБлокирај додека не се примат најмалку lengthсе примат. Сепак, ако се фати сигнал или далечинскиот домаќин се исклучи, функцијата може да врати помалку податоци.MSG_DONTWAITСо овој знаменце поставен, функцијата враќа дури и ако нормално би блокирала. address-
Со овој знаменце поставен, функцијата враќа дури и ако нормално би блокирала.
AF_UNIXАко сокетот е од типотaddressтип,addressе патеката до датотеката. Инаку, за несокетирани сокети,nullе IP адресата на, далечинскиот домаќин, или port-
ако сокетот е поврзан-ориентиран.
AF_INETandAF_INET6Овој аргумент се однесува само наportсокети, и го специфицира далечинскиот порт од кој се примаат податоците. Ако сокетот е поврзан-ориентиран,null.
Вратени вредности
socket_recvfrom() ќе биде false враќа број на примени бајти, или socket_last_error()ако имало грешка. Вистинскиот код за грешка може да се добие со повикување на socket_strerror() . This code may be passed to
Примери
Пример #1 socket_recvfrom() example
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 1223);
$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 12, 0, $from, $port);
echo "Received $buf from remote address $from and remote port $port" . PHP_EOL;
?>. Овој код за грешка може да се предаде на
Види Исто така
- socket_recv() Овој пример ќе иницира UDP сокет на порт 1223 од 127.0.0.1 и ќе отпечати најмногу 12 знаци примени од далечински домаќин.
- socket_send() - Испраќа податоци до поврзан сокет
- socket_sendto() - Испраќа порака до сокет, без разлика дали е поврзан или не
- socket_create() - Креирај сокет (крајна точка за комуникација)
Белешки од корисници 4 белешки
MSG_DONTWAIT doesn't seem to exist in windows sockets. However socket_set_nonblock() seems to do the trick.Pay attention! On some PHP version the MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)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.