Aktueller Standort: Startseite> Neueste Artikel> Wie benutze ich Socket_Set_Option, um SO_Reuseaddr festzulegen, um das Problem der Portbeschäftigung zu lösen?

Wie benutze ich Socket_Set_Option, um SO_Reuseaddr festzulegen, um das Problem der Portbeschäftigung zu lösen?

gitbox 2025-06-15

Wie setze ich SO_RUSEADDR mit socket_set_option ein, um das Problem der Beschäftigung des Ports zu lösen?

Bei der Entwicklung von PHP-basierten Netzwerkanwendungen, insbesondere Diensten, für die Bindung bestimmter Ports für das Zuhören erforderlich ist (wie HTTP-Server, Socket-Dienste usw.), ist es üblich, auf das Problem der "Ports werden belegt" zu begegnen. Dieses Problem tritt normalerweise nach gestopptem Dienst auf, und das Betriebssystem ist immer noch der Ansicht, dass der Port besetzt ist, was dazu führt, dass der Dienst nicht neu gestartet und den Port binden.

Um dieses Problem effektiv zu lösen, liefert PHP die Funktion Socket_set_option , mit der verschiedene Socket -Optionen festgelegt werden können. So_Reuseaddr ist eine häufig verwendete Option, mit der wir das Problem der Hafenbelegung lösen können. In diesem Artikel wird detailliert erläutert, wie SO_ReuseadDR mit Socket_Set_Option festgelegt wird, damit Sie den gebrauchten Port wiederherstellen können, wenn der Dienst neu gestartet wird.

1. Was ist so_reuseaddr ?

So_Reuseaddr ist eine Socket -Option, mit der ein Port im Status TIME_WAIT gebunden werden kann. Das Betriebssystem legt normalerweise den Status eines Ports auf time_wait fest, um sicherzustellen, dass alle Pakete gereinigt wurden. Das System verhindern jedoch, dass andere Prozesse im Zeitpunkt Time_wait an den Port binden. Nachdem Sie So_Reuseaddr eingestellt haben, können Sie den Port wiederherstellen, wenn er noch in Time_wait Status ist.

2. Setzen Sie SO_RUSEADDR mit socket_set_option

In PHP wird in der Funktion Socket_Set_Option verwendet, um Optionen für einen bereits erstellten Socket festzulegen. Die Syntax ist wie folgt:

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_option</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">$level</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$optname</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$optval</span></span><span> )
</span></span>
  • $ Socket : Die Socket -Ressource zum Festlegen von Optionen.

  • $ Level : Die Protokollschicht, normalerweise Sol_Socket , bedeutet, dass die Option auf Sockelebene betrieben wird.

  • $ optname : Der Optionsname für So_Reuseaddr ist dieser Wert so_Reuseaddr (normalerweise 1 ).

  • $ optval : Der Optionswert für So_Reuseaddr ist normalerweise 1 , was angibt, dass die Option aktiviert ist.

3. Beispielcode

Hier ist ein einfaches PHP -Beispiel, das zeigt, wie man Socket_Set_Option verwendet, um die Option SO_RUSEADDR festzulegen, um die Portbelegung zu vermeiden.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Erstellen a TCP 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 Schöpfung scheiterte: "</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">// aufstellen SO_REUSEADDR Optionen</span></span><span>
</span><span><span class="hljs-variable">$optval</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_REUSEADDR, </span><span><span class="hljs-variable">$optval</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">"aufstellen SO_REUSEADDR Optionen失败: "</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-variable">$socket</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">// An die angegebenen binden IP und Ports</span></span><span>
</span><span><span class="hljs-variable">$host</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-keyword">if</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-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</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-variable">$socket</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">"Socket Erfolgreich gebunden an <span class="hljs-subst">$host</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>\n";

</span><span><span class="hljs-comment">// Hören Sie sich Port an</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_listen</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">"Zuhören 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-variable">$socket</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">// Warten auf die Verbindung</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">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$clientSocket</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">"Kundenverbindung fehlgeschlagen empfangen: "</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-variable">$socket</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">"Ein Client ist verbunden!\n"</span></span><span>;

</span><span><span class="hljs-comment">// Schließen Sie die Verbindung</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</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-meta">?&gt;</span></span><span>
</span></span>

4. Code Beschreibung

  1. Socket erstellen : Wir verwenden die Funktion Socket_Create , um einen TCP -Socket zu erstellen. Diese Funktion gibt eine Ressource zurück, die den erstellten Socket darstellt. Wenn die Schöpfung fehlschlägt, wird falsch zurückgegeben.

  2. Setzen Sie die Option SO_Reuseaddr : Wir setzen SO_Reuseaddr über Socket_Set_Option so, dass der Port weiterhin neu geführt werden kann, wenn der Port in Time_wait -Status ist.

  3. Binden Sie Port : Verwenden Sie die Funktion Socket_Bind , um den erstellten Socket an die angegebene IP -Adresse und den angegebenen Port zu binden. Wenn die Bindung fehlschlägt, gibt das Programm eine Fehlermeldung aus.

  4. Höranschluss : Die Funktion Socket_Listen wird verwendet, um gebundene Ports zu hören, und ist bereit, Client -Verbindungen zu akzeptieren.

  5. Empfangen von Client -Verbindung : Socket_accept wird warten und die Client -Verbindung akzeptieren.

5. Zusammenfassung

Durch Einstellen der Option SO_RUSEADDR mit SOCKKET_SET_OPTION kann das Problem des Anschlusspflusses effektiv gelöst werden, insbesondere wenn der Dienst neu gestartet wird. Mit dieser Option können Sie den Port wiederherstellen, wenn er in Time_wait -Status ist, und vermeiden Sie, dass der gängige Fehler "Port ist" Fehler.

Es ist zu beachten, dass die Option SO_ReuseadDR Sie nicht ermöglicht, die Port -Nutzungsregeln des Betriebssystems vollständig zu umgehen. Es löst hauptsächlich die Situation, in der sich der Port im Status time_wait befindet. Wenn Sie in anderen Szenarien auf dem Auftragsbeschäftigung stoßen, müssen Sie möglicherweise komplexere Netzwerkkonfigurationen oder Prozessmanagementstrategien in Betracht ziehen.