လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> "သတိပေးချက် - socket_accept_Accept () ကိုဖြေရှင်းရန်အဖြေ () သည် Socket_Accept ကိုအသုံးပြုသောအခါ parameter 1 ကိုအရင်းအမြစ်ဖြစ်ရန်မျှော်လင့်သည်။

"သတိပေးချက် - socket_accept_Accept () ကိုဖြေရှင်းရန်အဖြေ () သည် Socket_Accept ကိုအသုံးပြုသောအခါ parameter 1 ကိုအရင်းအမြစ်ဖြစ်ရန်မျှော်လင့်သည်။

M66 2025-05-29

Socket Programming အတွက် PHP ၏ Socket_Ack_Acception () function ကိုအသုံးပြုသောအခါဘုံသတိပေးချက်သည် -

 Warning: socket_accept() expects parameter 1 to be resource, bool given

အမှားအယွင်းများဆိုသည်မှာ Societ_Accept () function သည်ရရှိသော parameter သည်အရင်းအမြစ်တစ်ခုအဖြစ်မျှော်လင့်သည်။ သို့သော်အမှန်မှာ၎င်းသည် boolean value (များသောအားဖြင့် မှားယွင်းသော ) သို့ဆိုလျှင် Boolean အမျိုးအစား၏တန်ဖိုးသည်မျှော်လင့်ထားသည့် socket အရင်းအမြစ်အစားအဘယ်ကြောင့်ဖြတ်သန်းသွားသနည်း။ အဓိကအကြောင်းအရင်းမှာ socket_create () သို့မဟုတ် socket_bind () သို့မဟုတ် socket_listen () သို့မဟုတ် socket_listen () သို့မဟုတ် socket_listen () သို့မဟုတ် socket_listen () သို့မဟုတ် socket_listen ()) ၏ခြေလှမ်းတစ်ခုဖြစ်သည်။

အမှားအရင်းအမြစ်

ပုံမှန် Socket Server Code ဖွဲ့စည်းပုံကိုကြည့်ကြစို့။

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);

while (true) {
    $client = socket_accept($socket);
    // ...client ဆက်သွယ်မှုကိုကိုင်တွယ်
}

အတန်းတစ်ခု ( socket_create ()) တစ် ဦး (ဥပမာ Socket_create () ) မှလွဲ . $ socket သည် မှန်ကန်သော socket အရင်းအမြစ်မဟုတ်ပါ။ call socket_accept ($ socket) ကို ခေါ်ဆိုသည့်အခါအမှားတစ်ခုဖြစ်ပေါ်သည်။

ပြ the နာကိုဘယ်လိုရှာရမလဲ

ကျွန်ုပ်တို့သည် Socket_Last_Error () နှင့် Socket_StError () function များကိုသုံးနိုင်သည်။

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() ဆုံးရှုံး: " . socket_strerror(socket_last_error()) . "\n");
}

if (!socket_bind($socket, '0.0.0.0', 8080)) {
    die("socket_bind() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $msg = "ဝမ်းသာစွာနှုတ်ဆက်ခြင်း M66 Socket အစေခံ!\n";
    socket_write($client, $msg, strlen($msg));
    socket_close($client);
}

ဤနည်းအားဖြင့်မည်သည့် function call ပျက်ကွက်မှုမအောင်မြင်ပါ,

ဘုံအကြောင်းတရားများနှင့်ဖြေရှင်းနည်းများ

  1. ခွင့်ပြုချက်မလုံလောက် အကယ်. သင်သည် 10224 အောက်ရှိ 1024 အောက်ရှိဆိပ်ကမ်းသို့ချည်နှောင်ရန်ကြိုးစားပါကခွင့်ပြုချက်မလုံလောက်ခြင်းကြောင့်ပျက်ကွက်လိမ့်မည်။ ဖြေရှင်းနည်းသည် 1024 အထက်ရှိ ports များကိုအသုံးပြုရန်သို့မဟုတ် administrator အခွင့်ထူးများဖြင့် script ကိုဖွင့်ရန်ဖြစ်သည်။

  2. ဆိပ်ကမ်းကိုသိမ်းပိုက်ခဲ့သည် အကယ်. port ကိုအခြားဖြစ်စဉ်များကသိမ်းပိုက်ထားပြီးဆိုလျှင် Socket_bind () ကျရှုံးလိမ့်မည်။ Port Occupancy ကိုကြည့်ရှုရန် NetStat -tlnp (Linux) သို့မဟုတ် NetStat -ano (Windows) ကဲ့သို့သော command များကိုသုံးနိုင်သည်။

  3. တရားမဝင်ချည်နှောင်ခြင်းလိပ်စာ <br> <br> သတ်မှတ်ထားသော IP လိပ်စာသည်တရားမ 0 င်ပါကသို့မဟုတ်စက်သည် configure မဟုတ်သော်လည်း socket_bind () ကျရှုံးလိမ့်မည်။ 0.0.0.0 (လုပ်ဖော်ကိုင်ဖက်များအားလုံးကိုချည်နှောင်ခြင်း) သို့မဟုတ်အမှန်တကယ် intranet IP ကဲ့သို့သောလိပ်စာသည်တရားဝင်နှင့်တရားဝင်ဖြစ်ကြောင်းသေချာပါစေ။

  4. PHP Socket extension ကိုမှန်ကန်စွာတင်ခြင်းမပြုပါနှင့် PHPP.ini တွင် Socket များ တိုးချဲ့ခြင်းကိုသေချာအောင်လုပ်ပါ။ phpinfo () သို့မဟုတ် extension_loaded ('socketets) မှတဆင့်စစ်ဆေးနိုင်သည်။

ဥပမာ - ရရှိနိုင်သည့် PHP Socket Server အပြည့်အစုံ

 <?php

$host = '0.0.0.0';
$port = 9000;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() ဆုံးရှုံး: " . socket_strerror(socket_last_error()) . "\n");
}

if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "နားထောင်ခြင်း: $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $welcome = "အလည်အပတ်ခရီးမှလှိုက်လှဲစွာကြိုဆိုပါသည် m66.net ၏ Socket အစေခံ!\n";
    socket_write($client, $welcome, strlen($welcome));
    socket_close($client);
}

socket_close($socket);

အကျဉ်းချုပ်

When you encounter an error of "expects parameter 1 to be resource" when using socket_accept() , don't directly think that the problem lies in socket_accept() , but you should back-track whether the previous socket_create() , socket_bind() and socket_listen() were executed successfully. အမှားအယွင်းများနှင့်မှတ်တမ်း output ကိုထည့်ခြင်းအားဖြင့်သင်သည်ပြ the နာကိုလျင်မြန်စွာရှာဖွေပြီးမှားယွင်းသောလင့်ခ်များပေါ်တွင်အချိန်ဖြုန်းခြင်းကိုရှောင်ရှားနိုင်သည်။

ဤဆောင်းပါးသည်သင့်အားဤဘုံပြ problem နာကိုပိုမိုရှင်းလင်းစွာနားလည်သဘောပေါက်ရန်နှင့်နေရာရေးနှင့်ဖြေရှင်းနည်းများကိုနားလည်ရန်ကူညီနိုင်လိမ့်မည်ဟုကျွန်ုပ်မျှော်လင့်ပါသည်။