လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> အဘယ်ကြောင့် socket_accept () ဆက်သွယ်မှုကိုလက်ခံရရှိလို့မရဘူး? ငါးပိအမှားများနှင့်ဖြေရှင်းချက်ငါးခု

အဘယ်ကြောင့် socket_accept () ဆက်သွယ်မှုကိုလက်ခံရရှိလို့မရဘူး? ငါးပိအမှားများနှင့်ဖြေရှင်းချက်ငါးခု

M66 2025-06-23

PHP, Socket_Accept နှင့်အတူပရိုဂရမ် socket () နှင့်အတူ programming socket () သည် နားထောင်ခြင်း socket နှင့်ချိတ်ဆက်ထားသော client connection တစ်ခုကိုလက်ခံသည့်သော့ချက်ဖြစ်သည်။ သို့သော်အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုကာလအတွင်း, သင်သည် socket_acception () ဆက်သွယ်မှုမရရှိနိုင်သည့်အခြေအနေများ () သည်အခြေအနေများကြုံတွေ့ရနိုင်သည်။ ဤပြ problem နာသည်မကြာခဏရှုပ်ထွေးနေသည်။ ဤဆောင်းပါးသည်အမှားအယွင်းများ၏အဖြစ်အပျက်ငါးခုကိုစာရင်းပြုစုပြီးပြ problems နာများကိုလျင်မြန်စွာရှာဖွေရန်နှင့်ဖြေရှင်းရန်ကူညီရန်သက်ဆိုင်ရာဖြေရှင်းနည်းများကိုပေးလိမ့်မည်။

1 ။ Socket_listen ကိုခေါ်ရန် ()

ပြနာဖော်ပြချက်:
လိပ်စာကိုဖွင့်ပြီးချည်နှောင်ခြင်းနှင့်လိပ်စာကိုဖွင့်ပြီးနောက် socket_listen () ကိုမခေါ်ပါက Socket သည် connection တောင်းဆိုမှုများကိုနားထောင်ခြင်းနှင့် Socket_Accept () သည် ဘယ်သောအခါမျှအောင်မြင်လိမ့်မည်မဟုတ်ပါ။

ဖြေရှင်းချက် -
Socket_Anception ကို မခေါ်မီ Societ_listen () ကိုသေချာအောင်လုပ်ပါ။

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket); // အလွန်အရေးကြီးသော
$client = socket_accept($socket);

2 ။ ဆိပ်ကမ်းကိုသိမ်းပိုက်သို့မဟုတ်အောင်မြင်စွာခညျြနှောငျမဟုတ်ပါဘူး

ပြနာဖော်ပြချက်:
အကယ်. သင်ချည်နှောင်ထားသောဆိပ်ကမ်းကိုအခြားပရိုဂရမ်များကအခြားပရိုဂရမ်များကသိမ်းပိုက်ပါက Socket_bind () သည် ပျက်ကွက် လိမ့်မည်။

ဖြေရှင်းချက် -
ဆိပ်ကမ်းကိုသိမ်းပိုက်မနေကိုစစ်ဆေးရန် NetStat -tlnp ကဲ့သို့သော command များကိုသုံးနိုင်သည် Grep 12345Socket_bind ၏ return_bind () နှင့် socket_last_Error () ကိုသုံးပါ။

 if (!socket_bind($socket, '0.0.0.0', 12345)) {
    echo "binding ပျက်ကွက်: " . socket_strerror(socket_last_error($socket));
    exit;
}

3 ။ client connection ကိုအစပျိုးခြင်းသို့မဟုတ်ဆက်သွယ်မှုလိပ်စာမမှန်ကန်ပါ

ပြနာဖော်ပြချက်:
ဆာဗာဆက်သွယ်မှုကိုဆာဗာစောင့်နေစဉ် 0 န ဆောင်မှုခံယူသူသည်လုံးဝချိတ်ဆက်ရန်မကြိုးစားပါ, သို့မဟုတ်မှားယွင်းသောလိပ်စာနှင့်ဆိပ်ကမ်းသို့ချိတ်ဆက်ရန်မကြိုးစားပါ,

ဖြေရှင်းချက် -
0 န်ဆောင်မှုခံယူသူ၏ဆက်သွယ်မှုလိပ်စာနှင့်ဆိပ်ကမ်းမှန်ကန်မှုရှိမရှိအတည်ပြုပါ။

 $client = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);

ဆက်သွယ်မှုသည်အောင်မြင်မှုရှိ, ရှိမရှိကိုယ်တိုင်ကိုယ်ကျစမ်းသပ်ရန် Telnet M66.net 12345 ကို သုံးနိုင်သည်။

4 ။ socket_accept () ကိုပိတ်ဆို့ထားပြီးပရိုဂရမ်ကို "မှီဝဲ"

ပြနာဖော်ပြချက်:
Socket_Accept () သည် client connection မရှိပါကစောင့်ဆိုင်းနေသောပိတ်ဆို့ခြင်းလုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ဤသည်အစီအစဉ်ကိုမှီဝဲကဲ့သို့ program ကိုကြည့်ရှုစေခြင်းငှါ။

ဖြေရှင်းချက် -
Leading Socket Socket သို့ Socket_set_setBlock () ကို သုံးနိုင်သည်။

 socket_set_nonblock($socket);
$client = @socket_accept($socket);
if ($client === false) {
    echo "လက်ရှိဆက်သွယ်မှုတောင်းဆိုမှုမရှိပါ\n";
}

သို့မဟုတ်:

 $read = [$socket];
$write = $except = [];
if (socket_select($read, $write, $except, 5) > 0) {
    $client = socket_accept($socket);
}

5 ။ Firewall သို့မဟုတ် Network ကန့်သတ်ချက်များသည်ဆက်သွယ်မှုများကိုပိတ်ဆို့ထားသည်

ပြနာဖော်ပြချက်:
ဆာဗာနားထောင်ခြင်းဆိပ်ကမ်းကိုမှန်ကန်စွာသတ်မှတ်ထားသော်လည်း operating system firewall rules သို့မဟုတ် cloud server ၏လုံခြုံရေးအဖွဲ့မူဝါဒမူဝါဒမူဝါဒသည် client connection တောင်းဆိုမှုများကိုကာကွယ်ပေးသည်။

ဖြေရှင်းချက် -
ဆာဗာ၏ port ကိုစစ်ဆေးပြီးဖွင့်ပါ။ ဥပမာအားဖြင့်, ITTAVERS သို့မဟုတ် firewalld ကို Linux တွင်အသုံးပြုခြင်းသည် port 12345 ကိုအသုံးပြုခွင့်ပြုသည်,