現在の位置: ホーム> 最新記事一覧> Socket_Createがリモートホストに接続されている場合に発生する一般的な問題は何ですか?それを解決する方法は?

Socket_Createがリモートホストに接続されている場合に発生する一般的な問題は何ですか?それを解決する方法は?

gitbox 2025-09-21

2。ファイアウォール/ネットワークポリシーブロッキング(ローカルまたはピアサイド)

:接続は長い間拒否またはタイムアウトしました。ポートは到達できません。
原因:ネイティブまたはピアファイアウォール(Iptables、UFW、Cloud Vendor Security Group)がポート、または中間NAT/ACLブロックをブロックします。
トラブルシューティングと解像度

  • Telnetホストポート/ NC -VZホストポート/カールを使用してください - 接続時間アウトこのサーバーでポート接続をテストします。

  • クラウドプラットフォームセキュリティグループ、ホストIPTABLE、ホストファイアウォールログを確認してください。

  • 許可ルール(必要なIP/ポートのみを開く)を開くか追加するか、セキュリティグループポリシーを調整します。

  • ISP/コンピュータールームによって制限されている場合は、ネットワーク管理者に連絡するか、出口を変更します。


3:タイムアウト(ブロッキング/非ブロッキングおよびタイムアウト時間設定)

現象socket_connectは、長い時間後に失敗するか、スクリプトがブロックされます。
原因:デフォルトのブロッキング動作は設定されておらず、合理的なタイムアウトが設定されていません。リモートエンドは反応しないか、応答が遅いです。
トラブルシューティングと解像度

  • 非ブロッキング接続を使用して、自分自身をチェックするタイムアウトを実装するか、 Stream_Socket_Clientを使用してタイムアウトパラメーターを指定します。
    PHPソケットの例(セットタイムアウト):

     <span><span><span class="hljs-variable">$sock</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_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    @</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$sock</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-variable">$start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>();
    </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>;
    </span><span><span class="hljs-keyword">while</span></span><span> (!@</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$sock</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-variable">$err</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$err</span></span><span> === SOCKET_EISCONN) </span><span><span class="hljs-keyword">break</span></span><span>;
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">time</span></span><span>() - </span><span><span class="hljs-variable">$start</span></span><span> &gt; </span><span><span class="hljs-variable">$timeout</span></span><span>) {
            </span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
            </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"connect timeout"</span></span><span>);
        }
        </span><span><span class="hljs-title function_ invoke__">usleep</span></span><span>(</span><span><span class="hljs-number">100000</span></span><span>);
    }
    </span><span><span class="hljs-title function_ invoke__">socket_set_block</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    </span></span>
  • Simpler: Stream_Socket_Client( "tcp:// host:port"、$ errno、$ errstr、$ timeout)


4:許可とselinux/apparmorの制限

現象:スクリプトは外部接続を確立できず、ログに明らかなネットワークエラーはありません。
原因:SelinuxまたはApparmorには、プロセスネットワークアクセスに制限があります。またはPHP-FPMのOpen_Basedir / Disable_Functionsの制限。
トラブルシューティングと解像度

  • /var/log/audit/audit.log(selinux )またはシステムログを確認して、拒否されたエントリがあるかどうかを確認します。

  • 許容モードで一時的にテストするか、サービスに適切なSELINUXポリシーを追加します。

  • PHP構成がネットワーク関連の機能を無効にしないことを確認します( Socket_Createが無効になっているなど)。


V:プロトコル/ポートの不一致は、TCP/UDPと混合されます

現象:接続は成功していますが、応答はありません。またはデータは異常です。
理由:ターゲットサービスはUDPを使用しますが、クライアントはTCP、またはその逆を使用します。プロトコルレベル(TLSを予想するが直接TCPなど)。
トラブルシューティングと解像度

  • サービス契約(HTTP/HTTPS、TLS、SMTP、REDIS、MYSQLなど)が接続方法と一致していることを確認してください。

  • TLS/SSLの場合、 stream_socket_client( 'ssl:// host:port'、...)を使用する必要があります。


6:IPv6/IPv4は家族の問題に対処します

現象:ホストにはIPv4とIPv6の両方があり、間違ったアドレスファミリに接続すると、失敗またはタイムアウトが発生します。
解決する

  • af_inet(ipv4)またはaf_inet6(ipv6)を明示的に使用します。

  • getaddrinfoまたはdns_get_record()を使用して特定のアドレスを取得し、適切なファミリを選択します。


SSL/TLSハンドシェイクが失敗しました(証明書、SNI、暗号スイート)

現象:接続が確立されますが、握手が失敗し、OpenSSLエラーが発生します。
トラブルシューティングと解像度

  • Stream_socket_client( 'ssl:// host:port'、$ errno、$ errstr、$ timeout、stream_client_connect、$ context)を使用し、 SSLコンテキスト(cafile、verify_peer、sni)を構成します。例:

     <span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
        </span><span><span class="hljs-string">'ssl'</span></span><span> =&gt; [
            </span><span><span class="hljs-string">'verify_peer'</span></span><span> =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
            </span><span><span class="hljs-string">'cafile'</span></span><span> =&gt; </span><span><span class="hljs-string">'/etc/ssl/certs/ca-certificates.crt'</span></span><span>,
            </span><span><span class="hljs-string">'SNI_enabled'</span></span><span> =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
            </span><span><span class="hljs-string">'peer_name'</span></span><span> =&gt; </span><span><span class="hljs-string">'example.com'</span></span><span>,
        ]
    ]);
    </span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"ssl://example.com:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>, STREAM_CLIENT_CONNECT, </span><span><span class="hljs-variable">$context</span></span><span>);
    </span></span>
  • OpenSSLバージョンとサーバーサポートされた暗号スイートを表示し、必要に応じてスイートをアップグレードまたは調整します。

  • 証明書チェーンが完了しているかどうかを確認します(中間証明書を欠いていると、握手が失敗します)。


8:リソース制限(ファイル記述子、同時接続上の上限)

現象:接続は高い並行性で失敗し、「オープンファイルが多すぎる」と報告されました。
原因:システムulimit -nまたはプロセス最大オープンファイル制限。
トラブルシューティングと解像度

  • Ulimit -Nを使用して、現在の制限を表示します。 SystemD/Service Configurationまたは/etc/security/limits.confを調整して、制限を増やします。

  • プログラムの接続(接続プール)を再利用し、非同期/イベント駆動型モデルを使用して、同時ソケットの数を減らします。


9:不十分なエラー処理(特定のエラーコード/ログの欠如)

現象:「接続が失敗した」がわからないが、理由を知らない。
解決する

  • socket_last_error()socket_strerror()を使用して、詳細なエラー情報を取得します。

     <span><span><span class="hljs-variable">$err</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    </span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$err</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"socket error: <span class="hljs-subst">$err</span></span></span><span> - </span><span><span class="hljs-subst">$msg</span></span><span>");
    </span></span>
  • コンテキスト(ターゲットIP、ポート、時間、タイムアウト時間)をキャプチャして記録し、システムログとTCPDUMP分析を組み合わせます。


10:中間のプロキシ/透明プロキシ/NAT修正トラフィック

現象:外部ネットワークに接続しますが、動作は異常です(リクエストは傍受され、交換され、書き直されます)。
トラブルシューティングと解像度

  • ネットワークパスにエージェント(エンタープライズネットワーク、ISP)またはWAFがあるかどうかを確認します。

  • TCPDUMP / Wiresharkを使用してパケットをキャッチして、TCP 3回の握手とその後のパケットが変更またはリセット(RST)かどうかを確認します。

  • プロキシがある場合は、認証を追加するか、プロキシ要件に従ってプロキシチャネルに移動します。


11:高レベルのAPIを使用すると、よりシンプルで信頼性が高くなります

ネイティブソケットは強力ですが、書くのがより複雑です。一般的なTCP/HTTP/SSLシナリオの場合、優先順位が与えられます。

  • stream_socket_client() :組み込みのタイムアウトは、ssl://を直接サポートし、使いやすくすることができます。

  • curl(libcurl)拡張機能:豊富なオプションとタイムアウト設定を備えたHTTP/HTTPSに適しています。

  • 専用のクライアントライブラリ(Redis、MySQL、AMQPなど)は通常、多くの詳細を扱います。

例: Stream_Socket_Clientを使用して、簡潔に接続して読み書きします。

 <span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>;
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:12345"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$fp</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"connect failed: <span class="hljs-subst">$errno</span></span></span><span> </span><span><span class="hljs-subst">$errstr</span></span><span>");
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-string">"hello\n"</span></span><span>);
    </span><span><span class="hljs-variable">$resp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
}
</span></span>

デバッグと診断のヒント(実践リスト)

  1. 基本的な接続を検証するために、ローカルping / dig / telnet / nc最初に最初に検証します。

  2. PHPでsocket_last_errorsocket_strerrorを印刷して記録します。

  3. パケットキャプチャ(TCPDUMP)を使用して、3方向の握手が成功しているかどうか、RST/ICMPエラーがあるかどうかを確認します。

  4. サーバーログ(アクセス可能な場合)を確認して、接続要求または拒否が受信されるかどうかを確認します。

  5. サーバーファイアウォール(IPTABLES/NFTABLES、クラウドセキュリティグループ)、SELINUXポリシー、およびPHP-FPMアクセス許可を確認してください。

  6. 同じマシンまたはネットワークセグメントの別のホストを接続して、ネットワークの出口の問題をトラブルシューティングしてみてください。

  7. TLSの問題の場合、TEST OpenSSL S_CLIENT -CONNECT HOST:PORT -SERVERNAMEホストをテストして、握手の詳細を取得します。