Heim > Backend-Entwicklung > PHP-Tutorial > TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

藏色散人
Freigeben: 2023-04-07 13:08:01
nach vorne
2800 Leute haben es durchsucht

In diesem Artikel wird PHP-Code verwendet, um einen Kommunikationsprozess der TCP-Transportschicht zu testen.

TCP/IP-Protokoll

Sie können die Details dieses Protokolls überprüfen, indem Sie sich selbst< ;>

Der Inhalt der TCP/UDP-API von PHP ist der Inhalt im PHP-Handbuch

Socket-API

Getestete PHP-Version

TCP-Verbindungsaufbau und -schließstatus und Datenübertragungskommunikationsprozess

PHP-Code[Dies ist ein Beispiel im Handbuch]

 <?php
/**
 * Created by PhpStorm.
 * User: 1655664358@qq.com
 * Date: 2019/6/19
 * Time: 9:55
 */
error_reporting(E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we&#39;re getting
 * as it comes in. */
ob_implicit_flush();
$address = &#39;0.0.0.0&#39;;  //要监听的ip地址
$port = 54321;//要监听的端口 
//创建一个socket AF_INET是一个协议族 (一般都有AF_INET,AF_INET6,AF_UNIX c语言提供也是,只不过是地址族),而PHP叫网络协议  
//C语言提供的协议族是PF_INET,PF_INET6,PF_UNIX  
//SOCK_STREAM sock的服务类型  这里是字节流的服务类型用于TCP
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}
//socket选项  ,选项一般在socket创建后设置 用于设置TCP的连接属性
//选项几乎和c差不多一样
//一般来说这些选项我们可以通过修改系统内核来调整 
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
    echo &#39;Unable to set option on socket: &#39;. socket_strerror(socket_last_error()) . PHP_EOL;
}
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEPORT, 1)) {
    echo &#39;Unable to set option on socket: &#39;. socket_strerror(socket_last_error()) . PHP_EOL;
}
//绑定【有的叫命名socket】
if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
//监听 此时服务器进入  LISTEN状态
if (socket_listen($sock, 5) === false) {
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
do {
//接受客户端连接sock  从系统内核接受队列里取  如果取出则双方进入了ESTABLISHED状态
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type &#39;quit&#39;. To shut down the server type &#39;shutdown&#39;.\n";
    socket_write($msgsock, $msg, strlen($msg));
    do {
    //读客户端数据【从TCP接收接受缓冲区取】
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == &#39;quit&#39;) {
            break;
        }
        if ($buf == &#39;shutdown&#39;) {
        //发送FIN结束报文,正常情况服务器会进入CLOSED状态
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: You said &#39;$buf&#39;.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);
socket_close($sock);
Nach dem Login kopieren

Socket-Diensttyp

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

TCP/IP-Optionsdatei

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

Dann starten wir den Dienst

Befehl zur Anzeige des Dienststatus: netstat -ntlapc Der Status kann jede Sekunde aktualisiert werden

tcpdump-Tool:

tcpdump -A -XX -i lo
Nach dem Login kopieren

Client Wir verwenden einfach das Telent-Tool und testen

Das Testbild sieht wie folgt aus

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

Anschluss- und Abschaltplan

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]

Wenn die Abschaltung durch die eingeleitet wird Client, der Status ist:

Der Client sendet zunächst ein Endnachricht-FIN-Paket. Zu diesem Zeitpunkt befindet es sich im Status FIN_WAIT1. Der Server bestätigt, dass sich die Antwort im Status CLOSE_WAIT befindet >Zu diesem Zeitpunkt befindet sich der Client im Status FIN_WAIT2. Wenn die Nachricht endet, befindet sich der Server im Status TIME_WAIT

Zustandsübergangsdiagramm

TCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]Es spielt keine Rolle, ob Sie die von PHP oder SWOOLE bereitgestellte SOCKET-API oder den geschriebenen Test verwenden in C ist das Gleiche!

Das obige ist der detaillierte Inhalt vonTCP-Verbindungsaufbau- und -schließstatus und Datenübertragungsprozess [einschließlich PHP-Socket-API-Testexperimentcode]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:learnku.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage