Verstehen Sie zunächst die grundlegenden Funktionen von socket_wsaprotocol_info_import . Diese Funktion ist ein Tool in PHP zum Importieren von WSA -Protokollinformationen (Windows Socket API). Die Hauptfunktion besteht darin, die Informationen des Windows -Socket -Protokolls in den PHP -Socket -Kontext zu laden, sodass Entwickler verschiedene Arten von Netzwerkprotokollen auf Windows -Systemen flexibel verwenden können.
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$protocol_info</span></span><span> )
</span></span>
$ Socket : Die Socket -Ressource, die erstellt wurde.
$ protocol_info : Protokollinformationsbezeichner, die normalerweise über Socket_Get_Option und andere Methoden erhalten wird.
Der Rückgabewert dieser Funktion ist ein boolescher Wert, der angibt, ob der Betrieb erfolgreich ist.
Bei der Verwendung von PHP -Sockets auf Windows -Systemen und auf dem Aufrufen von Socket_Wsaprotocol_Info_IMport müssen Protokollinformationen importiert werden, sondern müssen häufig Steckdosen mit Funktionen wie Socket_Create und Socket_Bind erstellen und binden. Das Folgende ist ein häufiges Nutzungsszenario:
<span><span><span class="hljs-comment">// Erstellen a UDP Steckdosen</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_DGRAM, SOL_UDP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"创建Steckdosen失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// Protokollinformationen importieren</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span><span><span class="hljs-comment">// 绑定Steckdosen</span></span><span>
</span><span><span class="hljs-variable">$bind_result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'0.0.0.0'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bind_result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Bindung fehlgeschlagen: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"UDP Steckdosen创建并绑定成功。\n"</span></span><span>;
</span></span>
In diesem Beispiel erstellen wir zunächst einen UDP -Socket, erhalten dann die Protokollinformationen über socket_get_option und importieren die Protokollinformationen mithilfe von Socket_Wsaprotocol_Info_import in den Socket. Schließlich binden wir den Socket an die angegebene IP -Adresse und den angegebenen Port.
Dieser Ansatz ermöglicht es Ihnen, das Verhalten von Steckdosen in einer Windows -Umgebung, insbesondere wenn Sie ein bestimmtes Protokoll verwenden müssen, granularer steuern.
Mit der Socket_Select -Funktion von PHP können Sie zwischen mehreren Steckdosen auswählen, wodurch Blockiervorgänge vermieden werden. Sie können mehrere Verbindungsanforderungen gleichzeitig bearbeiten, was bei der Implementierung effizienter Netzwerkanwendungen sehr nützlich ist.
<span><span><span class="hljs-comment">// Erstellen a TCP Steckdosen</span></span><span>
</span><span><span class="hljs-variable">$serverSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$serverSocket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"创建Steckdosen失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// Protokollinformationen importieren</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span><span><span class="hljs-comment">// Binden und zuhören</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, </span><span><span class="hljs-string">'0.0.0.0'</span></span><span>, </span><span><span class="hljs-number">8081</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-comment">// Nicht blockierende festlegen</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span> = [</span><span><span class="hljs-variable">$serverSocket</span></span><span>];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$read</span></span><span> = </span><span><span class="hljs-variable">$clients</span></span><span>;
</span><span><span class="hljs-variable">$write</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$except</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-comment">// verwenden socket_select Nicht blockierendes Warten</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>) > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$read</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> == </span><span><span class="hljs-variable">$serverSocket</span></span><span>) {
</span><span><span class="hljs-comment">// Neue Verbindungen akzeptieren</span></span><span>
</span><span><span class="hljs-variable">$clientSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span>[] = </span><span><span class="hljs-variable">$clientSocket</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// Clientdaten lesen</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-string">""</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$clients</span></span><span>[</span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$clients</span></span><span>)]);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Empfangene Clientdaten: "</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"erhalten: "</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span>);
}
}
}
}
}
</span></span>
In diesem Beispiel erstellt der Server einen TCP-Socket und setzt ihn auf den Nicht-Blocking-Modus, wobei Socket_Select nicht blockierende E/A-Operationen implementiert. In Kombination mit Socket_WSAPROTOCOL_INFO_IMPORT können Sie spezifische Protokolle flexibel verwenden, um das Socket -Verhalten zu optimieren.
Über Socket_Recv und Socket_Send -Funktionen kann eine effiziente Netzwerkdatenübertragung durchgeführt werden. Wenn Sie mit Socket_WSAPROTOCOL_INFO_IMPORT verwendet werden, können Sie das Socket -Verhalten entsprechend den Protokollanforderungen einstellen, um sicherzustellen, dass die Datenübertragung stabiler ist.
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"创建Steckdosen失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// Protokollinformationen importieren</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);
</span><span><span class="hljs-comment">// Stellen Sie eine Verbindung zum Server her</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Verbindung ist fehlgeschlagen: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// Daten senden</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_send</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>), </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-comment">// Daten empfangen</span></span><span>
</span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_recv</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$buffer</span></span><span>, </span><span><span class="hljs-number">2048</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"erhalten数据: "</span></span><span> . </span><span><span class="hljs-variable">$buffer</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
In diesem Beispiel senden wir Daten über Socket_Send und empfangen Antwortdaten über Socket_Recv . In Kombination mit Socket_Wsaprotocol_info_import können die Socket -Protokollinformationen entsprechend den Anforderungen verschiedener Protokolle optimiert werden, wodurch die Kommunikationseffizienz und -zuverlässigkeit verbessert werden.