Stream_Socket_Recvfromは、UDPプロトコルまたはTCPプロトコルデータを受信するために使用されるPHPの関数です。プロトタイプは次のとおりです。
<span><span><span class="hljs-title function_ invoke__">stream_socket_recvfrom</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">$length</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$flags</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> ] ) : </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>$ socket :通常、 stream_socket_clientまたはstream_socket_serverを介して作成されたデータを読み取るソケットリソース。
$ length :読み取る最大バイト数。
$ flags :フラグパラメーター、デフォルトは0であり、正常に変更する必要はありません。
返品値:
成功したら、読み取りデータ文字列を返します。
失敗したときにfalseを返します。
Stream_Socket_Recvfromがデータを受信できないことがわかった場合、次の側面からトラブルシューティングできます。
まず、ネットワーク接続が正常であることを確認してください。 Stream_Socket_recvfrom関数は、ソケットとネットワーク間の接続に依存します。ターゲットホストが到達不可能であるなど、ネットワーク接続に問題がある場合、ファイアウォール設定は不適切で、データは当然受信されません。
トラブルシューティング方法:
pingコマンドを使用して、ターゲットホストに到達可能かどうかを確認します。
サーバーとクライアントのファイアウォール設定を確認して、UDPまたはTCPポートが開いていることを確認してください。
UDPプロトコルでは、 Stream_Socket_RecvFromは、ソケットが指定されたポートに適切にバインドされていない場合、または受信したデータが適切にリッスンされていない場合、データを受信できません。 TCPプロトコルで接続が正しく確立されていない場合、データを受信できません。
トラブルシューティング方法:
Stream_Socket_Serverが、指定されたポートを正しく作成および聴くことを確認してください。
socket_bind()を使用して、ソケットがローカルポートに正しくバインドされていることを確認します(特にUDPを使用する場合)。
送信端がデータを正しく送信しない場合、または送信されたデータパケットが失われた場合、受信端は当然データを受信できません。ネットワークの不安定性、プログラムの送信またはデータ形式の送信のエラーにより、データが配信されない場合があります。
トラブルシューティング方法:
送信端にログを印刷するか、ネットワークパケットキャプチャツール(Wiresharkなど)を使用して、データが正しく送信されるかどうかを確認します。
送信コードが正しい形式でデータを送信するかどうかを確認します。
Stream_socket_recvfromを呼び出すときにタイムアウトが設定されていない場合、またはタイムアウト時間が短すぎる場合、データは時間内に読み取られない場合があります。これは、特にデータ送信が遅いか遅延しているネットワーク環境で発生する可能性があります。
トラブルシューティング方法:
Stream_set_timeout関数を使用して、ソケットの読み取りタイムアウト時間を設定します。例えば:
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// にタイムアウトを設定します102番</span></span><span>
</span></span>受信者が可能なネットワーク遅延を処理できることを確認してください。
stream_socket_recvfromの読み取りモード(非ブロッキングモードなど)は、データの受信に影響を与える可能性があります。ソケットが非ブロッキングモードである場合、データが到着するのを待つ代わりに、読み取るデータがない場合にfalseを返します。
トラブルシューティング方法:
非ブロッキングモードが使用されているかどうかを確認するには、 Stream_set_blockingを介してソケットのブロッキング動作を調整できます。
<span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// ブロッキングモードに設定します</span></span><span>
</span></span>stream_socket_recvfromの2番目のパラメーター長は、読み取りあたりの最大バイト数を決定します。パケットがこのサイズを超えると、過剰が破棄され、完全なデータを受信できなくなります。
トラブルシューティング方法:
長さのパラメーターが完全なパケットを受信するのに十分な大きさであることを確認してください。パケットのサイズがわからない場合は、長さをより大きな値に設定したり、動的に調整したりできます。
受信者は、特定の形式でデータを期待する場合があります。受信したデータ形式が期待を満たしていない場合、データを正しく解析できないことにつながる可能性があります。これは「受信していないデータ」として現れます。
トラブルシューティング方法:
受信したデータの処理コードを確認して、データの形式とプロトコルが送信者と一致していることを確認します。
受信したデータを印刷し、データが正しく解析されているかどうかを確認します。
ロギング:送信先と受信先の両方にログを追加することにより、データの流れを追跡すると、問題がすぐに見つかります。
ネットワークパケットキャプチャ:WiresharkやTCPDUMPなどのツールを使用して、ネットワークデータパケットをキャプチャし、データがターゲットマシンに転送されたかどうかを確認します。
ステップバイステップ:単純な状況から始めて、各ステップの機能が正常であることを確認します。たとえば、 Stream_Socket_Sendtoを使用してシンプルデータを送信して、受信者が受信できるかどうかを確認します。