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.
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
socket_get_option — Liefert die Socket-Optionen für einen Socket
socket_get_option() gibt den Wert der Option zurück, die
im Parameter option
für den Socket
socket
angegeben wurde.
socket
Eine Socket-Instanz, die mit der Funktion socket_create() oder socket_accept() erzeugt wurde.
level
Der Parameter level
enthält die Protokollebene,
für die die Option gilt. Beispiel: Um Optionen auf der Socketebene
abzufragen, würde level
den Wert
SOL_SOCKET
enthalten. Andere Ebenen, etwa
TCP
, können abgefragt werden, indem man die
Protokollnummer dieser Ebene angibt. Protokollnummern können mit einem
Aufruf von getprotobyname() ermittelt werden.
option
Option | Beschreibung | Typ |
---|---|---|
SO_DEBUG |
Gibt an, ob Debug-Informationen mitgeschrieben werden. | int |
SO_BROADCAST |
Gibt an, ob die Übermittlung von Rundsende-Nachrichten unterstützt wird. | int |
SO_REUSEADDR |
Gibt an, ob lokale Adressen wiederverwendet werden können. | int |
SO_REUSEPORT |
Gibt an, ob lokale Ports wiederverwendet werden können. | int |
SO_KEEPALIVE |
Gibt an, ob Verbindungen durch periodische Aussendungen von Nachrichten aufrecht erhalten werden. Falls der verbundene Socket nicht auf diese Nachrichten antwortet, wird die Verbindung unterbrochen und Prozesse, die auf diesen Socket schreiben, erhalten ein SIGPIPE-Signal. | int |
SO_LINGER |
Gibt an, ob der Falls l_onoff von 0 verschieden und l_linger gleich 0 ist, werden alle noch nicht gesendeten Daten verworfen und im Fall eines verbindungsorientierten Sockets das Signal RST (Reset) an die Gegenstelle gesendet. Andererseits, falls sowohl l_onoff als auch l_linger von 0 verschieden sind, blockiert der Aufruf von socket_close() den Socket so lange, bis entweder alle Daten gesendet sind oder das Zeitlimit erreicht ist, das in l_linger gesetzt wurde. Wenn der Socket auf nicht-blockieren gesetzt ist, schlägt socket_close() fehl und gibt einen Fehler zurück. |
array. Das Array enthält zwei Schlüssel: l_onoff und l_linger. |
SO_OOBINLINE |
Gibt an, ob socket die Übertragung von
bandexternen Daten in der Reihenfolge überträgt, wie sie auftreten.
|
int |
SO_SNDBUF |
Gibt die Größe des Sendepuffers zurück. | int |
SO_RCVBUF |
Gibt die Größe des Empfangspuffers zurück. | int |
SO_ERROR |
Gibt den Fehlerstatus zurück und löscht ihn. | int (dieser Wert kann nicht von socket_set_option() gesetzt werden.) |
SO_TYPE |
Gibt den Typ von socket zurück (z. B.
SOCK_STREAM ).
|
int (dieser Wert kann nicht von socket_set_option() gesetzt werden.) |
SO_DONTROUTE |
Gibt an, ob ausgehende Nachrichten das standardmäßige Routing umgehen. | int |
SO_RCVLOWAT |
Gibt die Mindestanzahl Bytes an, die socket
bei einer Empfangsoperation verarbeiten soll.
|
int |
SO_RCVTIMEO |
Gibt bei Empfangsoperationen den Wert der Zeitspanne bis zu einer Zeitüberschreitung an. | array. Das Array enthält zwei Schlüssel: sec ist der Sekunden-Anteil der Zeitspanne und usec der Mikrosekunden-Anteil der Zeitspanne bis zu einer Zeitüberschreitung. |
SO_SNDTIMEO |
Gibt die Zeitspanne an, nach der bei Sendeoperationen eine Zeitüberschreitung ausgelöst wird. Eine Ausgabefunktion darf während der angegebenen Zeitspanne blockieren, falls die Ablaufsteuerung den Versand der Daten verhindert. | array. Das Array enthält zwei Schlüssel: sec ist der Sekunden-Anteil der Zeitspanne und usec der Mikrosekunden-Anteil der Zeitspanne bis zu einer Zeitüberschreitung. |
SO_SNDLOWAT |
Gibt die Mindestanzahl Bytes an, die socket
bei einer Ausgabeoperation verarbeiten soll.
|
int |
TCP_NODELAY |
Gibt an, ob der Nagle-TCP-Algorithmus deaktiviert ist. | int |
MCAST_JOIN_GROUP |
Tritt einer Multicast-Gruppe bei. |
array mit den Schlüsseln "group" ,
der eine IPv4 oder IPv6 Multicast-Adresse als String
angibt, und "interface" , der entweder eine
Schnittstellennummer als Int oder einen
Schnittstellennamen als String , wie etwa
"eth0" , angibt. 0 kann
angegeben werden, um festzulegen, dass die Schnittstelle unter
Verwendung von Routing-Regeln gewählt werden soll. (Dies kann nur
für socket_set_option() verwendet werden.)
|
MCAST_LEAVE_GROUP |
Verläßt eine Multicast-Gruppe. |
array. Siehe MCAST_JOIN_GROUP für
weitere Information. (Dies kann nur für
socket_set_option() verwendet werden.)
|
MCAST_BLOCK_SOURCE |
Blockiert Pakete, die von einer bestimmten Quelle an eine bestimmte Multicast-Gruppe, der man zuvor beigetreten ist, gesendet wurden. |
array mit denselben Schlüsseln wie
MCAST_JOIN_GROUP , plus einem zusätzlichen
Schlüssel, source , der die IPv4- oder
IPv6-Adresse der zu blockierenden Quelle als String
angibt. (Dies kann nur für socket_set_option()
verwendet werden.)
|
MCAST_UNBLOCK_SOURCE |
Unblockiert Pakete, die von einer bestimmten Quelle an eine bestimmte Multicast-Gruppe, der man zuvor beigetreten ist, gesendet wurden; d. h. entsprechende Pakete werden wieder empfangen. |
array mit demselben Format wie
MCAST_BLOCK_SOURCE . (Dies kann nur für
socket_set_option() verwendet werden.)
|
MCAST_JOIN_SOURCE_GROUP |
Empfange Pakete, die an eine bestimmte Multicast-Gruppe gesendet wurden, deren Quelladresse mit einem bestimmten Wert übereinstimmt. |
array mit demselben Format wie
MCAST_BLOCK_SOURCE . (Dies kann nur für
socket_set_option() verwendet werden.)
|
MCAST_LEAVE_SOURCE_GROUP |
Beende den Empfang von Paketen, die an eine bestimmte Multicast-Gruppe gesendet wurden, deren Quelladresse mit einem bestimmten Wert übereinstimmt. |
array mit demselben Format wie
MCAST_BLOCK_SOURCE . (Dies kann nur für
socket_set_option() verwendet werden.)
|
IP_MULTICAST_IF |
Die ausgehende Schnittstelle für IPv4 Multicast-Pakete. |
Entweder int, um die Schnittstellennummer anzugeben,
oder ein String mit dem Schnittstellennamen, wie
eth0 . Der Wert 0 kann verwendet
werden, um festzulegen, dass die Routingtabelle für die
Schnittstellenauswahl genutzt werden soll. Die Funktion
socket_get_option() gibt einen
Schnittstellenindex zurück. Es ist zu beachten, dass im Gegensatz
zur C-API, diese Option KEINE IP-Adresse akzeptiert. Das beseitigt
den Schnittstellenunterschied zwischen
IP_MULTICAST_IF und
IPV6_MULTICAST_IF .
|
IPV6_MULTICAST_IF |
Die ausgehende Schnittstelle für IPv6-Multicast-Pakete. |
Identisch zu IP_MULTICAST_IF .
|
IP_MULTICAST_LOOP |
Die Multicast-Loopback-Richtlinie für IPv4-Pakete aktiviert oder deaktiviert den Loopback von ausgehenden Multicasts, die zuvor verbunden worden sein müssen. Sie wirkt sich jedoch unterschiedlich aus, je nachdem, ob sie auf Unix oder Windows angewendet wird, wobei sie bei Ersterem den Empfangspfad betrifft und bei Letzterem den Sendepfad. |
int (entweder 0 oder
1 ). Für socket_set_option()
wird jeder Wert akzeptiert und gemäß den übelichen PHP-Regeln in
booleschen Wert konvertiert.
|
IPV6_MULTICAST_LOOP |
Analog zu IP_MULTICAST_LOOP , aber für IPv6.
|
int. Siehe IP_MULTICAST_LOOP .
|
IP_MULTICAST_TTL |
Die Lebensdauer ausgehender IPv4-Multicast-Pakete. Dies sollte ein Wert zwischen 0 (verlasse nicht die Schnittstelle) und 255 sein. Der Vorgabewert ist 1 (nur das lokale Netzwerk wird erreicht). | int zwischen 0 und 255. |
IPV6_MULTICAST_HOPS |
Analog zu IP_MULTICAST_TTL , aber für
IPv6- Pakete. Der Wert -1 wird ebenfalls akzeptiert und bedeutet,
dass die Vorgabewert der Route verwendet werden soll.
|
int zwischen -1 und 255. |
SO_MARK |
Bestimmt unter Linux eine Kennung für die Paketfilterung auf dem Socket. | int |
SO_ACCEPTFILTER |
Fügt einen Accept-Filter auf dem überwachten Socket hinzu (FreeBSD/NetBSD). Unter FreeBSD muss vorher ein Kernelmodul für den Accept-Filter geladen werden (z. B. accf_http). | Ein String mit dem Namen des Filters (maximale Länge: 15). |
SO_USER_COOKIE |
Bestimmt unter FreeBSD eine Kennung für die Paketfilterung auf dem Socket. | int |
SO_RTABLE |
Bestimmt unter OpenBSD eine Kennung für die Paketfilterung auf dem Socket. | int |
SO_DONTTRUNC |
Ungelesene Daten aufbewahren. | int |
SO_WANTMORE |
Einen Hinweis ausgeben, wenn weitere Daten verfügbar sind. | int |
TCP_DEFER_ACCEPT |
Benachrichtigt einen überwachenden Socket erst, wenn die Daten vollständig sind. | int |
SO_INCOMING_CPU |
Ermittlelt/bestimmt die CPU-Zugehörigkeit eines Sockets. | int |
SO_MEMINFO |
Ermittelt die gesamte meminfo eines Sockets. | int |
SO_BPF_EXTENSIONS |
Ermittelt die vom Kernel unterstützten BPF-Erweiterungen, die an einen Socket angehängt werden können. | int |
SO_SETFIB |
Bestimmt die Route-Tabelle (FIB) eines Sockets (nur FreeBSD). | int |
SOL_FILTER |
Filtert die einem Socket zugeordneten Daten (nur Solaris/Illumos). | int |
TCP_KEEPCNT |
Bestimmt die maximale Anzahl von Keepalive-Tests, die TCP senden soll, bevor die Verbindung abgebrochen wird. | int |
TCP_KEEPIDLE |
Bestimmt die Zeit, die die Verbindung im Leerlauf bleiben soll. | int |
TCP_KEEPINTVL |
Bestimmt die Zeit zwischen den einzelnen Keepalive-Tests. | int |
TCP_KEEPALIVE |
Bestimmt die Zeit, die die Verbindung im Leerlauf bleiben soll (nur macOS). | int |
TCP_NOTSENT_LOWAT |
Bestimmt die Höchstzahl der nicht gesendeten Daten in der Schreib-Warteschlange des Socket-Streams (nur Linux). | int |
Gibt den Wert der angegebenen Option zurück. Bei einem Fehler wird false
zurückgegeben.
Version | Beschreibung |
---|---|
8.0.0 |
socket ist nun eine
Socket-Instanz; vorher war es eine
resource.
|
Beispiel #1 socket_get_option()-Beispiel
<?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));
?>
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.
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).
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;
}
}
?>