PHP, Socket_Accept နှင့်အတူပရိုဂရမ် socket () နှင့်အတူ programming socket () သည် နားထောင်ခြင်း socket နှင့်ချိတ်ဆက်ထားသော client connection တစ်ခုကိုလက်ခံသည့်သော့ချက်ဖြစ်သည်။ သို့သော်အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုကာလအတွင်း, သင်သည် socket_acception () ဆက်သွယ်မှုမရရှိနိုင်သည့်အခြေအနေများ () သည်အခြေအနေများကြုံတွေ့ရနိုင်သည်။ ဤပြ problem နာသည်မကြာခဏရှုပ်ထွေးနေသည်။ ဤဆောင်းပါးသည်အမှားအယွင်းများ၏အဖြစ်အပျက်ငါးခုကိုစာရင်းပြုစုပြီးပြ problems နာများကိုလျင်မြန်စွာရှာဖွေရန်နှင့်ဖြေရှင်းရန်ကူညီရန်သက်ဆိုင်ရာဖြေရှင်းနည်းများကိုပေးလိမ့်မည်။
ပြနာဖော်ပြချက်:
လိပ်စာကိုဖွင့်ပြီးချည်နှောင်ခြင်းနှင့်လိပ်စာကိုဖွင့်ပြီးနောက် 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);
ပြနာဖော်ပြချက်:
အကယ်. သင်ချည်နှောင်ထားသောဆိပ်ကမ်းကိုအခြားပရိုဂရမ်များကအခြားပရိုဂရမ်များကသိမ်းပိုက်ပါက Socket_bind () သည် ပျက်ကွက် လိမ့်မည်။
ဖြေရှင်းချက် -
ဆိပ်ကမ်းကိုသိမ်းပိုက်မနေကိုစစ်ဆေးရန် NetStat -tlnp ကဲ့သို့သော command များကိုသုံးနိုင်သည် Grep 12345 ။ Socket_bind ၏ return_bind () နှင့် socket_last_Error () ကိုသုံးပါ။
if (!socket_bind($socket, '0.0.0.0', 12345)) {
echo "binding ပျက်ကွက်: " . socket_strerror(socket_last_error($socket));
exit;
}
ပြနာဖော်ပြချက်:
ဆာဗာဆက်သွယ်မှုကိုဆာဗာစောင့်နေစဉ် 0 န ် ဆောင်မှုခံယူသူသည်လုံးဝချိတ်ဆက်ရန်မကြိုးစားပါ, သို့မဟုတ်မှားယွင်းသောလိပ်စာနှင့်ဆိပ်ကမ်းသို့ချိတ်ဆက်ရန်မကြိုးစားပါ,
ဖြေရှင်းချက် -
0 န်ဆောင်မှုခံယူသူ၏ဆက်သွယ်မှုလိပ်စာနှင့်ဆိပ်ကမ်းမှန်ကန်မှုရှိမရှိအတည်ပြုပါ။
$client = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);
ဆက်သွယ်မှုသည်အောင်မြင်မှုရှိ, ရှိမရှိကိုယ်တိုင်ကိုယ်ကျစမ်းသပ်ရန် Telnet M66.net 12345 ကို သုံးနိုင်သည်။
ပြနာဖော်ပြချက်:
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);
}
ပြနာဖော်ပြချက်:
ဆာဗာနားထောင်ခြင်းဆိပ်ကမ်းကိုမှန်ကန်စွာသတ်မှတ်ထားသော်လည်း operating system firewall rules သို့မဟုတ် cloud server ၏လုံခြုံရေးအဖွဲ့မူဝါဒမူဝါဒမူဝါဒသည် client connection တောင်းဆိုမှုများကိုကာကွယ်ပေးသည်။
ဖြေရှင်းချက် -
ဆာဗာ၏ port ကိုစစ်ဆေးပြီးဖွင့်ပါ။ ဥပမာအားဖြင့်, ITTAVERS သို့မဟုတ် firewalld ကို Linux တွင်အသုံးပြုခြင်းသည် port 12345 ကိုအသုံးပြုခွင့်ပြုသည်,