PHPを使用してプログラミングネットワークの場合、 socket_recvは、接続されたソケットからデータを読み取るために一般的に使用される関数です。ただし、 Socket_Recvを呼び出した後にデータが受信されない状況に遭遇する場合があります。これにより、プログラムが適切に機能しません。この記事では、この状況の考えられる原因を詳細に分析し、対応するソリューションを提供します。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
$buffer = '';
$bytes = socket_recv($socket, $buffer, 2048, 0);
if ($bytes === false) {
echo "socket_recv 間違い: " . socket_strerror(socket_last_error($socket));
} elseif ($bytes === 0) {
echo "接続が閉じられています,データレセプションはありません";
} else {
echo "受け取った {$bytes} バイトデータ: " . $buffer;
}
socket_close($socket);
ここでは、$バイトの返品値に焦点を当てています。
正の整数:データは正常に受信され、受信したバイト数を示しました。
0:相手は接続を閉鎖し、データはありませんでした。
FALSE :エラーが発生しました。
これが最も一般的な状況です。ピア(サーバーまたはクライアント)がデータを送信しない場合、 socket_recvは当然コンテンツを受信できません。ネットワークプログラミングでは、両当事者は契約に従って厳密にデータを送信および受信する必要があります。
Socket_Connectは呼び出されますが、接続は中間ネットワークデバイスによって真に確立またはブロックされることはありません。現時点では、読み取り操作はデータを返さない場合があります。
Socket_Recvを呼び出すと、バッファの長さが小さすぎる場合、または読み取りフラグパラメーターが正しくない場合、データは読み取られない場合があります。
ブロッキングモードでは、 socket_recvは、戻る前にデータが到着するのを待ちます。
非ブロッキングモードでは、 Socket_Recvは、読み取るデータがない場合(特に環境に依存)、すぐに0またはFALSEを返します。
非ブロッキングモードが正しく処理されていない場合、データがないと誤解される可能性があります。
予期しない切断またはネットワークの例外により、 socket_recvが0またはfalseを返し、データを受信できません。
接続とデータ転送は、WiresharkやSimple Command Line Tool Telnet gitbox.netなどのパッケージグラブツールを使用してテストできます。
socket_last_error()とsocket_strerror()を使用して、特定のエラー情報について学びます。
$errorCode = socket_last_error($socket);
if ($errorCode !== 0) {
echo "Socket 間違い码: {$errorCode},間違い信息:" . socket_strerror($errorCode);
}
適切なバッファサイズを使用して、フラグを読み取ってください。通常、バッファサイズは1024-8192バイトであることをお勧めします。
非ブロッキングモードを使用している場合は、ブロッキングモードテストに戻ることができます。
socket_set_block($socket);
長期的な閉塞を避けるため、またはデータ状態がないため、タイムアウト判断とループの再試行ロジックを追加できます。
Socket_Recvデータを受信しない根本原因は、主にネットワーク接続の問題、ピアがデータを送信しないか、読み取りパラメーター設定が不適切です。接続ステータスを合理的に確認し、ブロッキングモードの設定、ネットワーク伝送のデバッグにより、問題を効果的に配置して解決できます。患者のデバッグは、ネットワークプログラミングの鍵です。基礎となるプロトコルとデータフロープロセスを理解することで、開発効率を大幅に改善できます。