လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_set_block + Socket_recv သည်အချက်အလက်များကိုပိတ်ဆို့ခြင်းနှင့်လက်ခံခြင်း

Socket_set_block + Socket_recv သည်အချက်အလက်များကိုပိတ်ဆို့ခြင်းနှင့်လက်ခံခြင်း

gitbox 2025-05-26

reception ည့်ခံခြင်းကဘာတွေလဲ။

ပိတ်ဆို့ခြင်းခံထားရသော reception ည့်ခံသည်လက်ခံသည့် function ကိုခေါ်ဆိုခြင်းခံရသည့် function ကိုခေါ်ဆိုသည့်အခါ, ၎င်းသည်လက်ခံရရှိသောအချက်အလက်များပြီးပြည့်စုံပြီးအချိန်နှင့်တပြေးညီဖြစ်သော်လည်းကွန်ယက်သည်အခြေအနေကောင်းမဟုတ်လျှင်, အစီအစဉ်သည်အချိန်ကြာမြင့်စွာစောင့်နေနိုင်သည်။

PHP မှ default socket သည်ပိတ်ဆို့ခြင်း mode ကိုဖြစ်သည်။ socket_set_set_nonblock ကိုပိတ်ဆို့ခြင်းမခံရပါက DEACT_RECV သည် အချက်အလက်များမရှိတော့သည့်အခါချက်ချင်းပြန်လာလိမ့်မည်။

နိဒါန်းနိဒါန်း

  • Socket_set_block (Resource $ socket): Bool

    သတ်မှတ်ထားသော socket ကို mode ကိုပိတ်ဆို့ရန်သတ်မှတ်သည်။

  • Socket_recv (INT $ len, INT $ len, into into into into into into ard socket, string string and buf): Int | false

    Socket မှအချက်အလက်များကိုလက်ခံပါ။ ပိတ်ဆို့ခြင်း mode မှာအချက်အလက်မရှိဘူးဆိုရင်ဒီပရိုဂရမ်ကဒေတာတွေရောက်လာတာကိုစောင့်နေလိမ့်မယ်။

Code Page

အောက်ပါဥပမာသည်ဆာဗာသို့ချိတ်ဆက်ပြီးနောက် TCP client တစ်ခုဖန်တီးရန် Socket_set_Set_Block ကို အသုံးပြု. socket ကိုပိတ်ထားရန် socket_scl ကိုသုံးပါ။ ထို့နောက်ဒေတာများကိုပိတ်ဆို့ရန် Socket_recv ကို သုံးပါ။

 <?php
// ဖန်တီးTCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()) . "\n");
}

// ဆာဗာကိုဆက်သွယ်ပါ
$server_ip = 'gitbox.net';
$server_port = 8080;

$result = socket_connect($socket, $server_ip, $server_port);
if ($result === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// တည်ဆောက်သည်socketပိတ်ဆို့ mode ကို၌တည်၏(ပုံမှန်အားဖြင့်၎င်းကိုပိတ်ဆို့ထားသည်)
socket_set_block($socket);

echo "အောင်မြင်စွာဆက်သွယ်မှု,ဒေတာကိုလက်ခံရရှိရန်စောင့်ဆိုင်း...\n";

while (true) {
    $buffer = '';
    // မှsocketအများဆုံးပိတ်ဆို့ခံရအတွက် rece ည့်ခံ1024ဒရယ်
    $bytes = socket_recv($socket, $buffer, 1024, 0);
    if ($bytes === false) {
        echo "socket_recv failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        break;
    } elseif ($bytes === 0) {
        // ဆက်သွယ်မှုပိတ်
        echo "ဆာဗာဆက်သွယ်မှုကိုပိတ်လိုက်သည်\n";
        break;
    } else {
        echo "ခံယူ {$bytes} ဒရယ်数据: $buffer\n";
    }
}

// ရုပ်သိမ်းခြင်းsocket
socket_close($socket);
?>

လုပ်ငန်းစဉ်ခွဲခြမ်းစိတ်ဖြာခြင်း

  1. TCP socket တစ်ခုဖန်တီးပါ။

  2. သတ်မှတ်ထားသောဆာဗာနှင့်ချိတ်ဆက်ပါ (Domain Name ကို gitbox.net ဖြင့်အစားထိုးသည်) ။

  3. Socket ကိုပိတ်ဆို့ထားကြောင်းသေချာစေရန် Societ_set_set_block

  4. Call Socket_recv , လက်ရှိတွင်ဒေတာမရှိပါကဒေတာဖတ်လို့မရသောအထိပိတ်ဆို့ခြင်းနှင့်စောင့်ဆိုင်းလိမ့်မည်။

  5. ဒေတာကိုလက်ခံရရှိပြီးနောက်ထုတ်ပုံနှိပ်။

  6. အကယ်. ဆာဗာသည်ဆက်သွယ်မှုကိုပိတ်ထားပါကကွင်းဆက်ကိုဖွင့်ပြီး Socket ကိုပိတ်လိုက်ပါ။

အကျဉ်းချုပ်

  • Socket_recv ခေါ်ဆိုသောအခါ Data_RECV ကိုခေါ်သည့်အခါ socket_recv ပိတ်ဆို့ခြင်းကိုပိတ်ထားရန် socket_set_block ကိုရှင်းလင်းစွာပိတ်ဆို့ခြင်း mode ကိုအတိအလင်းခွဲထုတ်နိုင်သည်။

  • Blocking Mode သည်ဒေတာ Real-Time လိုအပ်ချက်များမြင့်မားပြီးစောင့်ဆိုင်းခြင်းကိုစိတ်ထဲမထားပါနှင့်။

  • ပရိုဂရမ်ကိုပိတ်ဆို့ရန်မလိုချင်ပါက socket_set_set_setblock သို့မဟုတ် socket timeout ကိုသုံးနိုင်သည်။

ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းယန္တရားများကိုနားလည်ခြင်းနှင့်ပိတ်ဆို့ခြင်းယန္တရားများကိုနားလည်ခြင်းသည်ကွန်ယက်ဆက်သွယ်ရေးအစီအစဉ်များကိုကွဲပြားခြားနားသောလျှောက်လွှာလိုအပ်ချက်များကိုဖြည့်ဆည်းရန်ပိုမိုပြောင်းလဲစေနိုင်သည်။