In PHP sind Socket_getSockName und Socket_CMSG_Space zwei häufig verwendete Funktionen, wenn sie mit Steckdosen programmierende Netzwerke programmieren. Sie helfen Entwicklern, detaillierte Informationen über Sockets zu erhalten, insbesondere bei der Behandlung von Netzwerkkommunikation. In diesem Artikel wird vorgestellt, wie diese beiden Funktionen kombiniert werden, um Socket -Informationen zu erhalten.
Die Funktion Socket_getSockname wird verwendet, um die lokalen Adressinformationen zu erhalten, die einem angeschlossenen Socket zugeordnet sind. Dies ist sehr wichtig, um den Verbindungsstatus zwischen dem aktuellen Host und dem Remote -Host zu erreichen. Die Funktion ist wie folgt definiert:
int socket_getsockname ( int $socket , string &$address , int &$port )
$ Socket : Ist eine gültige Socket -Ressource.
$ Adresse : Gibt die lokale Adresse des Sockets zurück.
$ port : Gibt die Portnummer des Sockets zurück.
Mit der Funktion Socket_CMSG_space wird der für die aktuelle Nachrichtensteuerungsdaten (CMSG) erforderliche Speicherplatz zurückgegeben. Ziel ist es, die Größe der Nachrichtensteuerungsdaten für ein bestimmtes Protokoll zu berechnen, um den Platz für Steuermeldungen korrekt zuzuweisen.
int socket_cmsg_space ( int $level , int $type )
$ Level : Gibt die Protokollschicht an, normalerweise Sol_Socket .
$ type : steuert den meldungstyp wie so_rcvbuf .
Um besser zu verstehen, wie diese beiden Funktionen in Kombination verwendet werden, finden Sie hier einen einfachen PHP -Beispielcode, der zeigt, wie Sie Socket_getSockName und Socket_CMSG_Space verwenden, um Socket -Informationen zu erhalten.
<?php
// Erstellen a TCP Steckdosen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Steckdosen创建失败: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
// 绑定Steckdosen
$address = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $address, $port) === false) {
echo "Steckdosen绑定失败: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
// 获取Steckdosen的本地地址和端口
if (socket_getsockname($socket, $localAddress, $localPort) === false) {
echo "获取Steckdosen信息失败: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "Steckdosen本地地址: $localAddress\n";
echo "Steckdosen本地端口: $localPort\n";
}
// Holen Sie sich den Kontrollnachrichtenraum
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$space = socket_cmsg_space($level, $type);
echo "Steuern Sie die Größe des Nachrichtenraums: $space\n";
// 关闭Steckdosen
socket_close($socket);
?>
Socket erstellen : Erstellen Sie zunächst einen TCP -Socket über Socket_Create . AF_INET bedeutet, IPv4 -Protokoll zu verwenden, sock_stream bedeutet, dass Stream -Sockets verwendet werden, und Sol_tcp ist das Transportschichtprotokoll.
Gebundene Socket : Verwenden Sie Socket_Bind , um den Socket an eine bestimmte lokale Adresse und einen bestimmten Port zu binden (in diesem Beispiel ist die Adresse 127.0.0.1 und der Port 8080 ).
Holen Sie sich Socket -Informationen : Holen Sie sich die lokale Adresse und den Port des Sockets über die Funktion Socket_getSockName und geben Sie diese aus.
Berechnen Sie die Größe der Steuermeldung : Socket_cmsg_space berechnet den erforderlichen Steuerraum der Steuermeldung und gibt seine Größe aus. Hier verwenden wir SO_RCVBUF , um die Größe der Steuermeldung des Empfangspuffers zu erhalten.
Sockel schließen : Verwenden Sie die Funktion Socket_Close , um den Sockel zu schließen.
Mit dieser Kombination aus Socket_getsockname und Socket_CMSG_Space können Sie flexibel detaillierte Informationen zu Sockets in der Netzwerkprogrammierung erhalten, insbesondere in den folgenden Szenarien:
Netzwerkdebugging : Es kann verwendet werden, um Socket -Verbindungen zu debuggen, lokale Adressen und Ports zu erhalten und Verbindungsprobleme zu beheben.
Datenflussregelung : Durch die Berechnung der Raumgröße der Steuermeldung können Entwickler die Empfangs- und Sendenpuffer effektiv verwalten, um die Effizienz und Stabilität der Datenübertragung zu gewährleisten.
Stellen Sie bei der Verwendung von Socket_getSockName sicher, dass die Socket erfolgreich gebunden wurde, andernfalls gibt die Funktion einen Fehler zurück.
Bei der Berechnung des Kontrollnachrichtenraums können abhängig von verschiedenen Protokollen und Steuerungsnachrichtenstypen unterschiedliche Speicherplatzgrößen erforderlich sein. Verwenden Sie daher die richtigen Level- und Typparameter .