Just 2 notes here:
- On UNIX, If SO_DEBUG is set, the php program needs an effective user id of 0.
- activating SO_OOBINLINE on a socket is equivalent to passing MSG_OOB flag to each recieving functions used with that socket (eg: socket_recv, socket_recvfrom).socket_get_option
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
socket_get_option
Референца за `function.socket-get-option.php` со подобрена типографија и навигација.
socket_get_option
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
socket_get_option — Gets socket options for the socket
= NULL
На socket_get_option() function retrieves the value for the option specified by the option parameter for the specified socket.
Параметри
socket-
А Сокет инстанца креирана со socket_create() or socket_accept().
level-
На
levelparameter specifies the protocol level at which the option resides. For example, to retrieve options at the socket level, alevelпараметаротSOL_SOCKETwould be used. Other levels, such asTCP, can be used by specifying the protocol number of that level. Protocol numbers can be found by using the getprotobyname() function. option-
Available Socket Options Опција = NULL Тип SO_DEBUGReports whether debugging information is being recorded. int SO_BROADCASTReports whether transmission of broadcast messages is supported. int SO_REUSEADDRReports whether local addresses can be reused. int SO_REUSEPORTReports whether local ports can be reused. int SO_KEEPALIVEReports whether connections are kept active with periodic transmission of messages. If the connected socket fails to respond to these messages, the connection is broken and processes writing to that socket are notified with a SIGPIPE signal. int SO_LINGERReports whether the
socketlingers on socket_close() if data is present. By default, when the socket is closed, it attempts to send all unsent data. In the case of a connection-oriented socket, socket_close() will wait for its peer to acknowledge the data.Враќа l_onoff is non-zero and l_linger is zero, all the unsent data will be discarded and RST (reset) is sent to the peer in the case of a connection-oriented socket.
On the other hand, if l_onoff is non-zero and l_linger е различен од нула, socket_close() ќе блокира додека не се испратат сите податоци или додека не истече наведеното време во l_linger истече. Ако сокетот не е блокирачки, socket_close() ќе откаже и ќе врати грешка.
array. Низата ќе содржи два клучa: l_onoff and l_linger. SO_OOBINLINEReports whether the socketги остава податоците надвор од опсегот во линија.int SO_SNDBUFПријавува ја големината на баферот за испраќање. int SO_RCVBUFПријавува ја големината на баферот за примање. int SO_ERRORПријавува информации за статусот на грешката и ја брише. int (не може да се постави од socket_set_option()) SO_TYPEПријавува го socketтипот (на пр.SOCK_STREAM).int (не може да се постави од socket_set_option()) SO_DONTROUTEПријавува дали излезните пораки ги заобиколуваат стандардните објекти за насочување. int SO_RCVLOWATПријавува го минималниот број на бајти за обработка за socketоперации за влез.int SO_RCVTIMEOПријавува ја вредноста на тајмаутот за операции за влез. array. Низата ќе содржи два клучa: sec што е делот од секунди во вредноста на тајмаутот и usec што е делот од микросекунди од вредноста на тајмаутот. SO_SNDTIMEOПријавува ја вредноста на тајмаутот што го специфицира времето што една излезна функција блокира бидејќи контролата на протокот спречува испраќање податоци. array. Низата ќе содржи два клучa: sec што е делот од секунди во вредноста на тајмаутот и usec што е делот од микросекунди од вредноста на тајмаутот. SO_SNDLOWATПријавува го минималниот број на бајти за обработка за socketизлезни операции.int TCP_NODELAYПријавува дали Nagle TCP алгоритмот е оневозможен. int MCAST_JOIN_GROUPСе придружува на мултикаст група. array со клучеви "group", наведувајќи string со IPv4 или IPv6 мултикаст адреса и"interface", наведувајќи број на интерфејс (тип int) илиstringсо името на интерфејсот, како"eth0".0може да се наведе за да се означи дека интерфејсот треба да се избере според правилата за насочување. (може да се користи само во socket_set_option())MCAST_LEAVE_GROUPЈа напушта мултикаст групата. array. Види MCAST_JOIN_GROUPза повеќе информации. (може да се користи само во socket_set_option())MCAST_BLOCK_SOURCEБлокира пакети што пристигнуваат од специфичен извор до специфична мултикаст група, која претходно морала да биде придружена. array со исти клучеви како MCAST_JOIN_GROUP, плус еден дополнителен клуч,source, што се пресликува на string навестувајќи IPv4 или IPv6 адреса на изворот што треба да се блокира. (може да се користи само во socket_set_option())MCAST_UNBLOCK_SOURCEГи деблокира (повторно почнува да прима) пакети што пристигнуваат од специфична адреса на изворот до специфична мултикаст група, која претходно морала да биде придружена. array со ист формат како MCAST_BLOCK_SOURCE. (може да се користи само во socket_set_option())MCAST_JOIN_SOURCE_GROUPПрима пакети наменети за специфична мултикаст група чија адреса на изворот одговара на специфична вредност. array со ист формат како MCAST_BLOCK_SOURCE. (може да се користи само во socket_set_option())MCAST_LEAVE_SOURCE_GROUPПрестанува да прима пакети наменети за специфична мултикаст група чија адреса на изворот одговара на специфична вредност. array со ист формат како MCAST_BLOCK_SOURCE. (може да се користи само во socket_set_option())IP_MULTICAST_IFИзлезниот интерфејс за IPv4 мултикаст пакети. Големина на парче. int Или string специфицирање на бројот на интерфејсот или eth0со име на интерфејс, како 0 . Вредноста socket_get_option() може да се користи за да се означи дека табелата за насочување треба да се користи во изборот на интерфејсот. ФункцијатаIP_MULTICAST_IFandIPV6_MULTICAST_IF.IPV6_MULTICAST_IFвраќа индекс на интерфејс. Имајте предвид дека, за разлика од C API, оваа опција НЕ зема IP адреса. Ова го елиминира интерфејсот разлика помеѓу Излезниот интерфејс за IPv6 мултикаст пакети. IP_MULTICAST_IF.IP_MULTICAST_LOOPИсто како int Политиката за мултикаст затворање за IPv4 пакети овозможува или оневозможува затворање на излезните мултикасти, кои претходно морале да бидат приклучени. Сепак, ефектот се разликува, дали се применува на unixes или Windows, при што првиот е на патеката за примање, додека вториот е на патеката за испраќање. 0or1(или socket_set_option() ). ЗаIPV6_MULTICAST_LOOPсекоја вредност ќе биде прифатена и ќе биде претворена во булова според вообичаените PHP правила. IP_MULTICAST_LOOPАналогно наint. Види IP_MULTICAST_LOOP.IP_MULTICAST_TTL, но за IPv6. int Времето на живот на излезните IPv4 мултикаст пакети. Ова треба да биде вредност помеѓу 0 (не ја напуштајте интерфејсот) и 255. Стандардната вредност е 1 (се достигнува само локалната мрежа). IPV6_MULTICAST_HOPSсекоја вредност ќе биде прифатена и ќе биде претворена во булова според вообичаените PHP правила. IP_MULTICAST_TTLпомеѓу 0 и 255.int , но за IPv6 пакети. Вредноста -1 исто така е прифатена, што значи дека треба да се користи стандардната рута. SO_MARKпомеѓу -1 и 255. int SO_ACCEPTFILTERПоставува идентификатор на сокетот за целите на филтрирање пакети на Linux. string name of the filter (length 15 max). SO_USER_COOKIEиме на филтерот (максимум 15 знаци). int SO_RTABLEПоставува идентификатор на сокетот за цел на филтрирање пакети на FreeBSD. int SO_DONTTRUNCПоставува идентификатор на сокетот за цел на филтрирање пакети на OpenBSD. int SO_WANTMOREЗадржи непрочитани податоци. int TCP_DEFER_ACCEPTДај навестување кога има повеќе податоци подготвени. int SO_INCOMING_CPUНе известувај сокет за слушање додека не се подготват податоци. int SO_MEMINFOГи добива/поставува афинитетот на процесорот на сокетот. int SO_BPF_EXTENSIONSГи добива сите meminfo на сокетот. int SO_SETFIBГи добива поддржаните BPF екстензии од јадрото за прикачување на сокет. int SOL_FILTERПоставува табела за рутирање (FIB) на сокетот. (Само FreeBSD) int TCP_KEEPCNTФилтри припишани на сокет. (Само Solaris/Illumos) int TCP_KEEPIDLEПоставува максимален број на keepalive проби што TCP треба да ги испрати пред да ја прекине врската. int TCP_KEEPINTVLПоставува време колку врската треба да остане неактивна. int TCP_KEEPALIVEПоставува време помеѓу индивидуалните keepalive проби. int TCP_NOTSENT_LOWATПоставува време колку врската треба да остане неактивна. (Само macOS) int
Вратени вредности
Поставува ограничување на бројот на неиспратени податоци во редот за запишување од сокет стримот. (Само Linux) false при неуспех.
Примери
Пример #1 socket_get_option() example
<?php
$socket = socket_create_listen(1223);
$linger = array('l_linger' => 1, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
var_dump(socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR));
?>Види Исто така
- socket_create_listen() Враќа вредност на дадената опција, или
- socket_set_option() - Поставува опции за сокетот
Белешки од корисници 4 белешки
If using Unix Sockets, and you want to use SO_PEERCRED, you can use the number 17 for the optname (and SOL_SOCKET for the level). The PID of the connecting process will be returned.I was playing around with this option to use multiply socket connections with same hostname and same port (IRC). However the socket function needed for this is SO_REUSEPORT.
Though the majority of linux distro's does not have that yet officially implented in there distro's.
However for debian there is an patch that can be installed to get it working:
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c617f398edd4db2b8567a28e899a88f8f574798d
it has some work but I got it working after a while (Noobie in debian) maybe some other people are facing the same problem as I was.to receive UDP DHCP packets on a dedicated interface, you have to use the undocumented option SO_BINDTODEVICE:
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, 'eth1');
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);
socket_bind($socket, '255.255.255.255', 67);
while (1) {
if ($src = @socket_recv($socket, $data, 9999, 0)) {
echo $data . PHP_EOL;
}
}
?>