PHP ကွန်ယက်ဆက်သွယ်ရေးအစီအစဉ်များကိုရေးသည့်အခါတိကျသော protocol format နှင့်ကိုက်ညီသော binary data packets များကိုတည်ဆောက်ရန်လိုအပ်သည်။ ဤကိစ္စတွင် Pack () function သည်မရှိမဖြစ်လိုအပ်သောကိရိယာတစ်ခုဖြစ်သည်။ ၎င်းသည် PHP variable များကိုသတ်မှတ်ထားသောပုံစံဖြင့် binary strings များထဲသို့ထည့်သွင်းနိုင်ပြီးအခြေခံကွန်ယက်သို့မဟုတ်ဟာ့ဒ်ဝဲနှင့်ဆက်သွယ်မှုအတွက်အဆင်ပြေစေသည်။
Pack () PHP တွင် built-in function တစ်ခုဖြစ်ပြီး၎င်း၏အခြေခံ Syntax သည်အောက်ပါအတိုင်းဖြစ်သည် -
string pack(string $format, mixed ...$values)
$ format သည်နောက်ဆက်တွဲအချက်အလက်များကိုထုပ်ပိုးရန်နည်းလမ်းကိုဖော်ပြရန်အသုံးပြုသော format string ကိုဆိုလိုသည်။
$ တန်ဖိုးများကို ထုပ်ပိုးဖို့လိုအပ်တဲ့တန်ဖိုးဖြစ်ပါတယ်။
Pack မှတဆင့်ထုတ်လုပ်သည့်အချက်အလက်များကိုများသောအားဖြင့် binary stretocol format နှင့်ကိုက်ညီသော binary stretocol format နှင့်ကိုက်ညီသော binary stretocol form လုပ်ခြင်း,
ဤတွင်ဘုံ format ဇာတ်ကောင်များနှင့်၎င်းတို့၏အဓိပ္ပါယ်များရှိသည်။
ဇာတ်ကောင် format | ဖေါ်ပြ | သိမ်းပိုက် bytes အရေအတွက် |
---|---|---|
ဂ | လက်မှတ်မထားသော char (8 bits) | 1 |
n | လက်မှတ်မပြည့်မီသောတိုတောင်းသော (16-bit, network endian) | 2 |
n | လက်မှတ်မထိုးနိုင်သည့်ရှည်လျားသော (32 bits, network endianness) | 4 |
တစ်စီး | NUL ပြီးစီးခဲ့ string ကို (သတ်မှတ်ထားသောအရှည်) | ပေြာင်းလဲတတ်သော |
တစ်စီး | ကွက်လပ်များနှင့်ပြည့်စုံသော (သတ်မှတ်ထားသောအရှည်) နှင့်အတူ string ကို | ပေြာင်းလဲတတ်သော |
ဆုတောင်းပါ | Hexadecimal String (မြင့်မားသော bit depinis) | တိုင်းနှစ်ခု bytes |
x | bytes ကိုဖြည့်ပါ (skip byte) | 1 |
Network protocols များတွင် N နှင့် N သည်အထူးသဖြင့် "endian endian" (Big-endian endian) နှင့် Cross-platform ဆက်သွယ်ရေးအတွက်သင့်တော်သောကြောင့်ဖြစ်သည်။
ကျွန်ုပ်တို့သည် protocol packet ကိုတည်ဆောက်ရန်လိုအပ်သည်ဆိုပါစို့, ဖွဲ့စည်းပုံသည်အောက်ပါအတိုင်းဖြစ်သည် -
1 byte: ဗားရှင်းနံပါတ် (လက်မှတ်မထားသော 8-bits)
2 bytes: မက်ဆေ့ခ်ျအမျိုးအစား (လက်မှတ်မထိုးထားသော 16 -bits)
4 bytes: User ID (ID)
10 bytes: အသုံးပြုသူအမည် (Ascii, Space Flaming)
Pack () ကို အောက်ပါနည်းလမ်းများဖြင့်သုံးနိုင်သည်။
<?php
$version = 1; // 1 ဒရယ်
$type = 100; // 2 ဒရယ်
$userId = 123456789; // 4 ဒရယ်
$username = 'Alice'; // အများဆုံး 10 ဒရယ်,အပြီးသတ်နေရာများ
$packet = pack('CnNA10', $version, $type, $userId, $username);
echo bin2hex($packet); // ထုပ်ပိုး hexadecimal ရလဒ်များကိုကြည့်ပါ
?>
ဤကုဒ်မှထုတ်လုပ်သော $ packet သည် protocol format နှင့်ကိုက်ညီသော binary data တစ်ခုဖြစ်ပြီး Socket သို့မဟုတ် Stream မှတဆင့်ဝေးလံခေါင်သီသော 0 န်ဆောင်မှုသို့တိုက်ရိုက်ပို့နိုင်သည်။
ဝေးလံခေါင်သီသော server address သည် M66.net နှင့် port သည် 9000 ဖြစ်သည်ဟုယူဆသည်မှာ TCP ဆက်သွယ်မှုမှတဆင့်အထက်တွင်ဖော်ပြထားသော binary deta ကိုသင်ပို့နိုင်သည်။
<?php
$fp = stream_socket_client("tcp://m66.net:9000", $errno, $errstr, 5);
if (!$fp) {
die("ဆက်သွယ်မှုမအောင်မြင်ပါ: $errstr ($errno)");
}
// ဒေတာ packets တွေကိုတည်ဆောက်ခြင်း
$packet = pack('CnNA10', 1, 100, 123456789, 'Alice');
// ဒေတာပို့ပါ
fwrite($fp, $packet);
// တုံ့ပြန်မှုကိုလက်ခံရရှိသည်
$response = fread($fp, 1024);
// ဆက်သွယ်မှုကိုပိတ်ပါ
fclose($fp);
echo "ဆာဗာတုံ့ပြန်မှု: " . bin2hex($response);
?>
၎င်းသည် Binary Package ကို ထုပ်ပိုးခြင်း နှင့်အတူ binary package တစ်ခုတည်ဆောက်ခြင်းနှင့်ဝေးလံခေါင်သီသော server သို့ပို့ခြင်း (ဥပမာ M66.NET ) သို့ပို့ခြင်း
ထုပ်ပိုးထားသောအချက်အလက်များသည်မျှော်လင့်ချက်များနှင့်ကိုက်ညီကြောင်းကြည့်ရှုရန် bin2hex () သို့မဟုတ် ဖြည်ခြင်း () ကိုသုံးပါ။
Send data ကိုခွဲခြမ်းစိတ်ဖြာရန် Wireshark စသည့် Network Packet Packet Packet Capture tools များကိုသုံးပါ။
Enterian ကိုအာရုံစိုက်ပါ။ ကွန်ယက် protocols အများစုသည် Network byte order format ကိုအသုံးပြုသည်။
Pack () သည် PHP တွင် Binary protocols များကိုကိုင်တွယ်ရန် PHP တွင်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်သည်။ ၎င်းကိုကျွမ်းကျင်သည်မှာ C / C ++ ဆာဗာဖြင့်ထိရောက်စွာဆက်သွယ်နိုင်ရုံသာမကစိတ်ကြိုက် protocol ဒီဇိုင်းများကိုအကောင်အထည်ဖော်ရန်လည်းကူညီနိုင်သည်။ သင်ဂိမ်းဖွံ့ဖြိုးတိုးတက်မှု, အရာများ၏အင်တာနက်အင်တာနက်ဆက်သွယ်မှုကိုဆက်သွယ်ခြင်း, သို့မဟုတ်သင်၏ကိုယ်ပိုင်လျှောက်လွှာ protocol ကိုတည်ဆောက်ခြင်း, pack () ကို တည်ဆောက်ခြင်းသည်နက်ရှိုင်းသောနားလည်မှုနှင့်လျှောက်လွှာနှင့်ထိုက်တန်သော function တစ်ခုဖြစ်သည်။