Aktueller Standort: Startseite> Neueste Artikel> So implementieren Sie eine wechselseitige Kommunikation basierend auf Socket_Recvmsg mit der Funktion Socket_Sendmsg?

So implementieren Sie eine wechselseitige Kommunikation basierend auf Socket_Recvmsg mit der Funktion Socket_Sendmsg?

M66 2025-07-04

In PHP ist die bidirektionale Kommunikation mit Socket-basierter Bidirektion eine gemeinsame Netzwerkprogrammieraufgabe. Wenn es um effiziente Messaging geht, können die beiden Funktionen Socket_Sendmsg und Socket_Recvmsg fortschrittlichere Funktionen bieten, damit Entwickler flexiblere und komplexere Kommunikationsmodi erzielen können. In diesem Artikel wird untersucht, wie Socket_Sendmsg mit Socket_Recvmsg verwendet wird, um eine bidirektionale Kommunikation zu erreichen.

1. Einführung in Socket_Sendmsg und Socket_Recvmsg

Zunächst müssen wir die grundlegende Verwendung dieser beiden Funktionen verstehen:

  • SOCKKET_SENDMSG : Diese Funktion wird verwendet, um Daten an einen bestimmten Socket zu senden und über sie zusätzliche Flags, Steuerungsinformationen oder Anhangsdaten zu übergeben. Der Hauptunterschied zwischen IT und Socket_Send besteht darin, dass Socket_Sendmsg eine stärkere Flexibilität bietet und komplexere Datenstrukturen unterstützen kann.

  • SOCKKET_RECVMSG : Diese Funktion wird verwendet, um Nachrichten aus einem Socket zu empfangen. Die Nachrichten können nicht nur Daten enthalten, sondern auch einige Steuerungsinformationen enthalten, z .

2. Wie bidirektionale Kommunikation funktioniert

In praktischen Anwendungen bedeutet zwei-Wege-Kommunikation häufig, dass beide Parteien in der Lage sein müssen, Daten voneinander zu senden und zu empfangen. Mit Socket_Sendmsg und Socket_Recvmsg können wir dies effizient erreichen. Diese beiden Funktionen können flexibler interagieren, indem der Meldungsheader und den Datenteil gesteuert werden.

2.1 Initialisieren Sie die Socket -Verbindung

Zunächst müssen wir einen Socket initialisieren, normalerweise über die Funktion Socket_Create, um eine TCP- oder UDP -Socket zu erstellen. Als nächstes können wir Socket_Bind oder Socket_Connect zur Bindung oder Verbindung verwenden.

 <span><span><span class="hljs-comment">// erstellen Socket</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_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">"Socket erstellen失败: "</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-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-comment">// Stellen Sie eine Verbindung zum Server her</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</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-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$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">"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-keyword">exit</span></span><span>();
}
</span></span>

2.2 Nachrichten mit Socket_Sendmsg senden

Mit der Funktion Socket_Sendmsg können wir Nachrichten mit komplexen Datenstrukturen senden. Normalerweise umfasst es Daten in eine MSGHDR -Struktur, die zusätzliche Steuerungsinformationen enthalten kann. Geben Sie beispielsweise das gesendete Flag -Bit, zusätzliche Daten, Zieladresse usw. an.

 <span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-variable">$len</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$msg</span></span><span>);

</span><span><span class="hljs-comment">// erstellen一个消息头</span></span><span>
</span><span><span class="hljs-variable">$msgHdr</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
    </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,           </span><span><span class="hljs-comment">// Die Standardzieladresse ist leer</span></span><span>
    </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; </span><span><span class="hljs-variable">$msg</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-variable">$len</span></span><span>)),  </span><span><span class="hljs-comment">// Dateninhalt</span></span><span>
    </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>
);

</span><span><span class="hljs-comment">// Senden Sie eine Nachricht</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_sendmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$msgHdr</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">"Senden 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-keyword">exit</span></span><span>();
}
</span></span>

2.3 Verwenden Sie Socket_Recvmsg , um Nachrichten zu empfangen

Die Funktion Socket_Recvmsg steht im Gegensatz zu Socket_Sendmsg und wird verwendet, um Nachrichten mit komplexen Daten aus dem Socket zu empfangen. Zusätzlich zum Datenteil kann die zurückgegebene Nachricht auch die Adresse, Logo und andere Informationen des Absenders enthalten.

 <span><span><span class="hljs-comment">// Ein Puffer, um sich darauf vorzubereiten, Nachrichten zu empfangen</span></span><span>
</span><span><span class="hljs-variable">$buf</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$bufLen</span></span><span> = </span><span><span class="hljs-number">1024</span></span><span>;
</span><span><span class="hljs-variable">$msgHdrRecv</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
    </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; &amp;</span><span><span class="hljs-variable">$buf</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-variable">$bufLen</span></span><span>)),
    </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>
);

</span><span><span class="hljs-comment">// Nachricht erhalten</span></span><span>
</span><span><span class="hljs-variable">$bytesReceived</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$msgHdrRecv</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bytesReceived</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">"Erhalten 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-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Eine Nachricht erhalten: "</span></span><span> . </span><span><span class="hljs-variable">$buf</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>

3.. Typischer Zwei-Wege-Kommunikationsprozess

In der tatsächlichen Verwendung kann der grundlegende Prozess der bidirektionalen Kommunikation in die folgenden Schritte zusammengefasst werden:

  1. Verbindungsanlage : Der Client stellt über Socket_Connect mit dem Server her und der Server wartet darauf, dass der Client über Socket_accecece herstellt.

  2. Nachricht senden : Der Client oder Server kann Nachrichten über Socket_Sendmsg senden. Es ist zu beachten, dass zusätzliche Daten oder Flag -Bits übergeben werden können, um spezifische Steuerungsinformationen darzustellen.

  3. Empfangsnachricht : Der Empfänger empfängt die Nachricht über Socket_Recvmsg . Die empfangene Nachricht enthält nicht nur den Datenteil, sondern auch einige Metadaten (z. B. Nachrichtenflags, Absender usw.).

  4. Alternatives Senden und Empfangen : Der Client und der Server verwenden abwechselnd Socket_Sendmsg und Socket_Recvmsg für einen Zwei-Wege-Datenaustausch. Jedes Mal kann eine andere Steuerungsinformation oder komplexere Datenstrukturen angehängt werden.

 <span><span><span class="hljs-comment">// Server-Seite-Code-Beispiel(Vereinfachte Version)</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-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</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-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);

</span><span><span class="hljs-comment">// Warten auf die Kundenverbindung</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-comment">// Daten empfangen und senden</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-variable">$header</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
    </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; &amp;</span><span><span class="hljs-variable">$buffer</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-number">1024</span></span><span>)),
    </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
    </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</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">$bytesReceived</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>, </span><span><span class="hljs-variable">$header</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bytesReceived</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Empfangen Sie eine Nachricht vom Client: <span class="hljs-subst">$buffer</span></span></span><span>\n";

    </span><span><span class="hljs-comment">// Senden Sie eine Antwort an den Client</span></span><span>
    </span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
    </span><span><span class="hljs-variable">$msgHdrSend</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
        </span><span><span class="hljs-string">'msg_name'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
        </span><span><span class="hljs-string">'msg_namelen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
        </span><span><span class="hljs-string">'msg_iov'</span></span><span> =&gt; </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> =&gt; </span><span><span class="hljs-variable">$msg</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> =&gt; </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$msg</span></span><span>))),
        </span><span><span class="hljs-string">'msg_iovlen'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>,
        </span><span><span class="hljs-string">'msg_control'</span></span><span> =&gt; </span><span><span class="hljs-literal">null</span></span><span>,
        </span><span><span class="hljs-string">'msg_controllen'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>,
        </span><span><span class="hljs-string">'msg_flags'</span></span><span> =&gt; </span><span><span class="hljs-number">0</span></span><span>
    );
    </span><span><span class="hljs-title function_ invoke__">socket_sendmsg</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>, </span><span><span class="hljs-variable">$msgHdrSend</span></span><span>);
}
</span></span>

4. Zusammenfassung

Die Verwendung von Socket_Sendmsg und Socket_Recvmsg -Funktionen kann die Socket-basierte Kommunikationseffizienz erheblich verbessern, insbesondere in Szenarien, in denen komplexe Nachrichten erforderlich sind oder zusätzliche Steuerinformationen übergeben werden. Ihre Flexibilität ermöglicht es den Entwicklern, eine Zwei-Wege-Kommunikation besser zu verwirklichen und den Datenaustausch durch Abfragen und Kontrolle von Nachrichten zu vervollständigen. Das Verständnis, wie diese Funktionen verwendet werden, ist entscheidend, um eine effiziente Netzwerkkommunikation zu erreichen.