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 — (PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
= NULL
На socket_get_option() Ги добива опциите на сокетот за сокетот option функцијата ја враќа вредноста за опцијата специфицирана од socket.
Параметри
socket-
А Сокет инстанца креирана со socket_create() or socket_accept().
level-
На
levelпараметарот за специфицираниотlevelпараметаротSOL_SOCKETпараметарот специфицира нивото на протоколот на кое се наоѓа опцијата. На пример, за да се добијат опции на ниво на сокет, би се користелTCP, може да се користат со специфицирање на бројот на протоколот на тоа ниво. Броевите на протоколи може да се најдат со користење на getprotobyname() function. option-
Достапни опции на сокетот Опција = NULL Тип SO_DEBUGИзвестува дали се снимаат информации за отстранување грешки. int SO_BROADCASTИзвестува дали е поддржано пренесување на емитувани пораки. int SO_REUSEADDRИзвестува дали локалните адреси може да се повторно користат. int SO_REUSEPORTИзвестува дали локалните порти може да се повторно користат. int SO_KEEPALIVEИзвестува дали врските се одржуваат активни со периодично пренесување пораки. Ако поврзаниот сокет не успее да одговори на овие пораки, врската се прекинува и процесите што пишуваат на тој сокет се известуваат со сигнал SIGPIPE. int SO_LINGERИзвестува дали
socketсе задржува на socket_close() ако има податоци. Стандардно, кога сокетот е затворен, тој се обидува да ги испрати сите неиспратени податоци. Во случај на сокет ориентиран кон поврзување, socket_close() ќе чека неговиот партнер да ги потврди податоците.Враќа l_onoff е различно од нула и l_linger е нула, сите неиспратени податоци ќе бидат отфрлени и RST (ресетирање) ќе му се испрати на партнерот во случај на сокет ориентиран кон поврзување.
Од друга страна, ако l_onoff е различно од нула и l_linger е различен од нула, socket_close() ќе блокира додека не се испратат сите податоци или додека не истече наведеното време во l_linger истече. Ако сокетот не е блокирачки, socket_close() ќе откаже и ќе врати грешка.
array. Низата ќе содржи два клучa: l_onoff and l_linger. SO_OOBINLINEИзвестува дали 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 име на филтерот (максимум 15 знаци). 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;
}
}
?>