Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Hauptsyntax der Socket-Funktion und Anwendungsbeispiele in PHP

Detaillierte Erläuterung der Hauptsyntax der Socket-Funktion und Anwendungsbeispiele in PHP

伊谢尔伦
伊谢尔伦Original
2017-05-22 14:49:264215Durchsuche

Wenn Sie in der tatsächlichen Entwicklung eine Socket-basierte Anwendung erstellen möchten, müssen Sie die Socket-Betriebsmethoden im Detail verstehen. Wenn Sie diese Betriebsmethoden kompetent verstehen und verwenden möchten, müssen Sie zunächst die verschiedenen Socket-Funktionen verstehen in PHP. Im vorherigen Kapitel haben wir ausführlich vorgestellt: Was ist der Socket in PHP? Hier ist eine Einführung in die Socket-Funktion in PHP. Es gibt Dutzende von Socket-Funktionen in PHP. Hier sind einige der wichtigsten Socket-Funktionen zur Einführung.

Ihre Syntaxformatparameter lauten wie folgt:

1. socket_create

socket_create ( int $domain , int $type , int $protocol )

Diese Funktion ist Wird verwendet, um einen Socket zu erstellen, der drei Parameter hat und dessen Rückgabewert ein Handle (Ressource) ist.

$domain gibt die beim Erstellen des Sockets verwendete Kommunikationsprotokollfamilie an. Die optionalen Werte sind:

AF_INET: Internetprotokoll basierend auf IPv4

AF_INET6: basierend auf dem Internetprotokoll für IPv6

AF_UNIX: lokales UNIX-Kommunikationsprotokoll

$type gibt den Interaktionstyp der Socket-Kommunikation an. Die optionalen Werte sind:

SOCK_STREAM: Bereitgestellte serialisierte, zuverlässige, verbindungsbasierte Vollduplex-Byte-Stream-Übertragung, unterstützt TCP

SOCK_DGRAM: Bietet Datagramm-artige, verbindungslose Übertragung mit fester maximaler Länge und automatischer Adressierungsfunktion, unterstützt UDP

SOCK_SEQPACKET: Bietet serialisierte, zuverlässige, zweikanalige, verbindungsbasierte Datagrammübertragung

SOCK_RAW: Bietet das ursprüngliche Netzwerkzugriffsprotokoll, spezielle Protokolle können manuell erstellt werden. Socket-Typ, unterstützt ICMP-Anfragen (z. B. Ping)

SOCK_RDM: Bietet zuverlässige Datagrammübertragung, die Reihenfolge kann nicht garantiert werden

$protocol gibt an, welches spezifische Übertragungsprotokoll der Socket verwendet, einschließlich ICMP, UDP, TCP, die Konstante SOL_UDP entspricht UDP und die Konstante SOL_TCP entspricht der Konstante TCP.

2. socket_bind

socket_bind ( resource $socket , string $address [, int $port = 0 ] )

Diese Funktion wird verwendet, um die IP-Adresse und den Port an das von socket_create erstellte Handle zu binden. Sie verfügt über drei Parameter und gibt einen Booleschen Wert zurück Wert.

$socket ist ein erforderlicher Parameter, der das von der socket_create-Funktion erstellte Handle darstellt.

$address ist ein erforderlicher Parameter, der die zu bindende IP-Adresse darstellt

$port ist ein optionaler Parameter, der die zu bindende Portnummer darstellt und angibt, welcher Port zum Abhören von Socket-Verbindungen verwendet wird. Wenn der erste Parameter der socket_create-Funktion AF_INET ist, muss dieser Parameter angegeben werden.

3. socket_listen

socket_listen ( resource $socket [, int $backlog = 0 ] )

Diese Funktion wird verwendet, um die Socket-Verbindung abzuhören, die gerade verbunden wird. Sie kann nur beim Interaktionstyp verwendet werden des Sockets ist SOCK_STREAM oder SOCK_SEQPACKET

Wird verwendet, hat es zwei Parameter und gibt einen booleschen Wert zurück.

$socket ist ein erforderlicher Parameter, der das von der Funktion socket_create erstellte Handle darstellt (und an den Host gebunden wurde).

$backlog ist ein optionaler Parameter, der darstellt, was auf die Verarbeitung wartet In der Warteschlange (Rückstand ist zulässig) maximale Anzahl von Verbindungen.

4. socket_set_block

socket_set_block ( resource $socket )

Diese Funktion wird verwendet, um das Socket-Handle in den Blockierungsmodus zu versetzen. Sie hat nur einen erforderlichen Parameter und gibt einen booleschen Wert zurück. Es kann einen nicht blockierenden Modus-Socket in den blockierenden Modus umwandeln.

Wenn Sie einen Vorgang (Empfangen, Senden, Verbinden, Akzeptieren usw.) in einem Socket im Blockierungsmodus ausführen, pausiert das Skript die Ausführung, bis es ein Signal empfängt oder den Vorgang abschließt.

$socket ist ein erforderlicher Parameter, der ein gültiges Socket-Handle darstellt (erstellt durch socket_create oder socket_accept).

Erklären Sie den Unterschied zwischen Blockierungsmodus und Nichtblockierungsmodus:

Nichtblockierend bedeutet, dass die Funktionsoperation erst dann ausgeführt wird Das Ergebnis kann nicht sofort abgerufen werden. Blockiert den aktuellen Thread und kehrt sofort zurück. Blockieren bedeutet, dass Sie erst nach Abschluss der Arbeit zurückkehren dürfen. Sie müssen eine Antwort von der anderen Partei erhalten, bevor Sie mit dem nächsten Schritt fortfahren können. Insbesondere bei vielen Benutzern ist es notwendig, es auf nicht blockierend einzustellen. Wenn es sich um einen Blockierungsmodus handelt und zwei Clients gleichzeitig verbunden sind und der Server die Anfrage eines Clients verarbeitet, wird die Anfrage des anderen Clients blockiert. Erst nachdem die Angelegenheiten des vorherigen Clients verarbeitet wurden, wird die Anfrage des letzteren Clients verarbeitet. wird darauf reagiert.

5. socket_write

socket_write ( resource $socket , string $buffer [, int $length = 0 ] )

Diese Funktion wird verwendet, um Pufferdaten einer bestimmten Größe in den Socket zu schreiben. Sie verfügt über drei Parameter und gibt das Wort des zurück geschriebene Daten. Anzahl der Abschnitte.

$socket ist ein erforderlicher Parameter und stellt ein gültiges Socket-Handle dar.

$buffer ist ein erforderlicher Parameter, der die zu schreibenden Zeichenfolgendaten angibt.

$length ist ein optionaler Parameter, der die Anzahl der Datenbytes angibt, die der Reihe nach in den Socket geschrieben werden sollen. Wenn sein Wert größer als die Anzahl der Bytes im $buffer ist, wird er stillschweigend abgefangen es in $buffer. Länge in Bytes.

6. socket_read

socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )

Diese Funktion wird zum Lesen von Daten der angegebenen Bytelänge aus dem Socket verwendet. Sie verfügt über drei Parameter und gibt die gelesenen Zeichenfolgen zurück .

$socket ist ein erforderlicher Parameter und stellt ein gültiges Socket-Handle dar.
$length ist ein erforderlicher Parameter, der die Länge der zu lesenden Bytes angibt.

$type ist ein optionaler Parameter. Der Standardwert ist PHP_BINARY_READ, was bedeutet, dass Binärdaten sicher gelesen werden können. Der andere optionale Wert ist PHP_NORMAL_READ, was bedeutet, dass das Lesen beendet wird, wenn r oder n auftritt.

7. pfsockopen

pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

该函数用于实现一个持久的socket连接,即长连接,返回一个句柄。它与 fsockopen 的区别在于,pfsockopen 建立的连接,在脚本执行完毕后,并不会断开。

8. socket_set_option

socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )

该函数用于设置socket的控制选项,有四个参数,返回布尔值。

$socket 是必选参数,代表一个有效的socket句柄。

$level 是必选参数,指定option起作用的协议级别,一般取常量 SOL_SOCKET。

$optname 是必选参数,指定要控制的选项名称。

$optval 是必选参数,指定选项的值。

9. socket_last_error 

socket_last_error ([ resource$socket ] )

该函数用于获取任何socket函数产生的最后错误代号,返回值为整型。

10. socket_strerror 

socket_strerror ( int $errno )

该函数用于获取错误代号代表的错误描述,返回值为字符串。

以上所有的函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释:

extension=php_sockets.dll

如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。

下面通过创建一个服务端和客户端的例子来说明这些函数的用法:

  1. 服务器端

<?php
//确保在连接客户端时不会超时
set_time_limit(0);
$ip = &#39;127.0.0.1&#39;;
$port = 1935;
/*
 +-------------------------------
 *    @socket通信整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_bind
 *    @socket_listen
 *    @socket_accept
 *    @socket_read
 *    @socket_write
 *    @socket_close
 +--------------------------------
 */
/*----------------    以下操作都是手册上的    -------------------*/
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
    echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";
}
if(($ret = socket_bind($sock,$ip,$port)) < 0) {
    echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";
}
if(($ret = socket_listen($sock,4)) < 0) {
    echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";
}
$count = 0;
do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    } else {
        
        //发到客户端
        $msg ="测试成功!\n";
        socket_write($msgsock, $msg, strlen($msg));
        
        echo "测试成功了啊\n";
        $buf = socket_read($msgsock,8192);
        
        
        $talkback = "收到的信息:$buf\n";
        echo $talkback;
        
        if(++$count >= 5){
            break;
        };
        
    
    }
    //echo $buf;
    socket_close($msgsock);
} while (true);
socket_close($sock);
?>

2. 客户端

<?php
error_reporting(E_ALL);
set_time_limit(0);
echo "<h2>TCP/IP Connection</h2>\n";
$port = 1935;
$ip = "127.0.0.1";
/*
 +-------------------------------
 *    @socket连接整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_connect
 *    @socket_write
 *    @socket_read
 *    @socket_close
 +--------------------------------
 */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
    echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "OK.\n";
}
echo "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\n";
$result = socket_connect($socket, $ip, $port);
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
    echo "连接OK\n";
}
$in = "Ho\r\n";
$in .= "first blood\r\n";
$out = &#39;&#39;;
if(!socket_write($socket, $in, strlen($in))) {
    echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "发送到服务器信息成功!\n";
    echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>";
}
while($out = socket_read($socket, 8192)) {
    echo "接收服务器回传信息成功!\n";
    echo "接受的内容为:",$out;
}
echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>

【相关教程推荐】

1. 《php.cn独孤九贱(4)-php视频教程

2.   php编程从入门到精通全套教程

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Hauptsyntax der Socket-Funktion und Anwendungsbeispiele in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn