PHP တွင် Socket-based bidirectional ဆက်သွယ်ရေးဆိုသည်မှာဘုံကွန်ယက်ပရိုဂရမ်းမင်းလုပ်ငန်းတာဝန်တစ်ခုဖြစ်သည်။ ထိရောက်သောစာတိုပေးပို့ရေးနှင့်ပတ်သက်လာလျှင် function_sendmmsg နှင့် socket_recvmsg နှစ်ခုသည် developer များပိုမိုပြောင်းလွယ်ပြင်လွယ်။ ရှုပ်ထွေးသောဆက်သွယ်ရေးပုံစံများကိုရရှိရန်ပိုမိုအဆင့်မြင့်လုပ်ဆောင်မှုများကိုပေးနိုင်သည်။ ဤဆောင်းပါးသည် bidirectional communicence ကိုရရှိရန် Socket_RecVMsg နှင့် Socket_Recvmsg နှင့်မည်သို့အသုံးပြုရမည်ကိုလေ့လာလိမ့်မည်။
ပထမ ဦး စွာကျွန်ုပ်တို့သည်ဤလုပ်ဆောင်မှုနှစ်ခု၏အခြေခံကျသောအသုံးပြုမှုကိုနားလည်ရန်လိုအပ်သည်။
Socket_sendmmsg : ဒီ function ကိုသတ်မှတ်ထားသော socket တစ်ခုသို့ဒေတာများကိုပို့ရန်အသုံးပြုသည်, အပိုအလံများ, ထိန်းချုပ်မှုသတင်းအချက်အလက်သို့မဟုတ်ပူးတွဲဖိုင်အချက်အလက်များကိုကူးယူနိုင်သည်။ ၎င်းနှင့် Socket_send အကြားအဓိကကွာခြားချက်မှာ Socket_sendmsg သည် ပိုမိုအားကောင်းသည့်ပြောင်းလွယ်ပြင်လွယ်မှုပေးပြီးပိုမိုရှုပ်ထွေးသောဒေတာတည်ဆောက်ပုံများကိုထောက်ပံ့ပေးနိုင်သည်။
Socket_recvMsg : ဒီ function ကို socket ထဲကနေမက်ဆေ့ခ်ျများလက်ခံရရှိရန်အသုံးပြုသည်။ ၎င်းတွင်အချက်အလက်များမပါ 0 င်နိုင်သည့်မက်ဆေ့ခ်ျ များမှာ အချက်အလက်များပါ 0 င်သည့်အချက်အလက်များ,
လက်တွေ့ကျသောအပလီကေးရှင်းများတွင်နှစ် ဦး နည်းဆက်သွယ်မှုသည်နှစ်ဖက်စလုံးကိုတစ် ဦး နှင့်တစ် ဦး အချက်အလက်များပေးပို့ခြင်းနှင့်လက်ခံရန်လိုအပ်သည်ဟုဆိုလိုသည်။ Socket_sendmmmsg နှင့် Socket_recvmsg တို့ နှင့်အတူဤထိရောက်စွာအောင်မြင်ရန်။ ဤလုပ်ဆောင်ချက်နှစ်ခုသည်မက်ဆေ့ခ်ျခေါင်းစီးနှင့်အချက်အလက်အပိုင်းကိုထိန်းချုပ်ခြင်းအားဖြင့်ပိုမိုလွယ်ကူစွာပိုမိုလွယ်ကူစွာအပြန်အလှန်ဆက်သွယ်နိုင်သည်။
ပထမ ဦး စွာကျွန်ုပ်တို့သည် TCP သို့မဟုတ် UDP အမျိုးအစား socket တစ်ခုဖန်တီးရန် Socket_create function မှတဆင့် socket တစ်ခုကိုအစပြုရန်လိုအပ်သည်။ နောက်တစ်ခုက binding သို့မဟုတ် connection အတွက် Socket_bind သို့မဟုတ် Socket_Connect ကို သုံးနိုင်သည်။
<span><span><span class="hljs-comment">// ဖန်တီး Socket</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket ဖန်တီး失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>());
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-comment">// ဆာဗာကိုဆက်သွယ်ပါ</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဆက်သွယ်မှုမအောင်မြင်ပါ: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>());
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span></span>
ရှုပ်ထွေးသောဒေတာအဆောက်အအုံများပါ 0 င်သောမက်ဆေ့ခ်ျများပေးပို့ရန်ကျွန်ုပ်တို့အား socket_sendmmsg function ကိုခွင့်ပြုသည်။ များသောအားဖြင့်၎င်းသည်အချက်အလက်များကိုနောက်ထပ်ထိန်းချုပ်မှုအချက်အလက်များပါ 0 င်နိုင်သည့် MsghDR ဖွဲ့စည်းပုံတွင်အချက်အလက်များကို encapsulates ။ ဥပမာအားဖြင့် Sent Flag Bit, အပိုအချက်အလက်များ, destination address ကိုသတ်မှတ်ပါ။
<span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-variable">$len</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$msg</span></span><span>);
</span><span><span class="hljs-comment">// ဖန်တီး一个消息头</span></span><span>
</span><span><span class="hljs-variable">$msgHdr</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
</span><span><span class="hljs-string">'msg_name'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-comment">// default destination လိပ်စာသည်ဗလာဖြစ်သည်</span></span><span>
</span><span><span class="hljs-string">'msg_namelen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_iov'</span></span><span> => </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> => </span><span><span class="hljs-variable">$msg</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> => </span><span><span class="hljs-variable">$len</span></span><span>)), </span><span><span class="hljs-comment">// ဒေတာအကြောင်းအရာ</span></span><span>
</span><span><span class="hljs-string">'msg_iovlen'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>,
</span><span><span class="hljs-string">'msg_control'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_controllen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_flags'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>
);
</span><span><span class="hljs-comment">// မက်ဆေ့ခ်ျပို့ပါ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_sendmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$msgHdr</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ပေးပို့ခြင်းမအောင်မြင်ပါ: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>());
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span></span>
Socket_recvmsg function သည် socket_sendmmmsg နှင့်ဆန့်ကျင်ပြီး socket မှရှုပ်ထွေးသောအချက်အလက်များပါ 0 င်သောမက်ဆေ့ခ်ျများကိုလက်ခံရရှိရန်အသုံးပြုသည်။ ဒေတာအစိတ်အပိုင်းတစ်ခုအပြင်ပေးပို့သောသတင်းစကားတွင်ပေးပို့သူ၏လိပ်စာ, လိုဂိုနှင့်အခြားအချက်အလက်များလည်းပါ 0 င်နိုင်သည်။
<span><span><span class="hljs-comment">// မက်ဆေ့ခ်ျများလက်ခံရရှိရန်ပြင်ဆင်ထားရန်ကြားခံ</span></span><span>
</span><span><span class="hljs-variable">$buf</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$bufLen</span></span><span> = </span><span><span class="hljs-number">1024</span></span><span>;
</span><span><span class="hljs-variable">$msgHdrRecv</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
</span><span><span class="hljs-string">'msg_name'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_namelen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_iov'</span></span><span> => </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> => &</span><span><span class="hljs-variable">$buf</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> => </span><span><span class="hljs-variable">$bufLen</span></span><span>)),
</span><span><span class="hljs-string">'msg_iovlen'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>,
</span><span><span class="hljs-string">'msg_control'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_controllen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_flags'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>
);
</span><span><span class="hljs-comment">// မက်ဆေ့ခ်ျကိုလက်ခံရရှိသည်</span></span><span>
</span><span><span class="hljs-variable">$bytesReceived</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$msgHdrRecv</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bytesReceived</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"လက်ခံရရှိမှုမအောင်မြင်ပါ: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>());
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"မက်ဆေ့ခ်ျကိုလက်ခံရရှိခဲ့သည်: "</span></span><span> . </span><span><span class="hljs-variable">$buf</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>
အမှန်တကယ်အသုံးပြုမှုတွင်ကျေးကျွန်ဆက်သွယ်မှု၏အခြေခံဖြစ်စဉ်ကိုအောက်ပါအဆင့်များသို့အကျဉ်းချုပ်ဖော်ပြနိုင်သည်။
connection storning : client သည် socket_connect မှတစ်ဆင့် server မှတဆင့်ဆာဗာသို့ချိတ်ဆက်ပြီး server သည် client ကို socket_accept မှတဆင့်ဆက်သွယ်ရန်စောင့်ဆိုင်းနေသည်။
မက်ဆေ့ခ်ျပို့ပါ ။ 0 န်ဆောင်မှုခံယူသူသို့မဟုတ်ဆာဗာသည် Socket_sendmmsg မှတစ်ဆင့်မက်ဆေ့ခ်ျများပို့နိုင်သည်။ သတိပြုသင့်သည်မှာတိကျသောထိန်းချုပ်မှုအချက်အလက်များကိုကိုယ်စားပြုရန်အပိုဆောင်းအချက်အလက်များသို့မဟုတ်အလံများကိုဖြတ်သန်းသွားနိုင်သည်ကိုသတိပြုသင့်သည်။
မက်ဆေ့ခ်ျကိုလက်ခံရရှိသည် ။ လက်ခံသူသည် socket_recvmsg မှတဆင့်မက်ဆေ့ခ်ျကိုလက်ခံရရှိသည်။ လက်ခံရရှိသည့်သတင်းစကားသည်အချက်အလက်အပိုင်း, သို့သော်အချို့သော metadata (မက်ဆေ့ခ်ျအလံ, ပေးပို့သူစသည်တို့) အချို့ Metadata တို့ပါ 0 င်သည်။
အခြားပို့ခြင်းနှင့်လက်ခံခြင်း - client_sendmmmsg နှင့် socient_Recvmsg ကို two-way data_ecvmsg ကိုအသုံးပြုသည်။ ကွဲပြားခြားနားသောထိန်းချုပ်မှုသတင်းအချက်အလက်သို့မဟုတ်ထိုထက်ပိုရှုပ်ထွေးသောဒေတာအဆောက်အ ဦ များကိုပူးတွဲနိုင်ပါသည်။
<span><span><span class="hljs-comment">// ဆာဗာ - ဘေးထွက်ကုဒ်ဥပမာ(ရိုးရှင်းသောဗားရှင်း)</span></span><span>
</span><span><span class="hljs-variable">$serverSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-comment">// client connection ကိုစောင့်ဆိုင်း</span></span><span>
</span><span><span class="hljs-variable">$clientSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);
</span><span><span class="hljs-comment">// ဒေတာကိုလက်ခံရရှိခြင်းနှင့်ပေးပို့ပါ</span></span><span>
</span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-variable">$header</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
</span><span><span class="hljs-string">'msg_name'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_namelen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_iov'</span></span><span> => </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> => &</span><span><span class="hljs-variable">$buffer</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> => </span><span><span class="hljs-number">1024</span></span><span>)),
</span><span><span class="hljs-string">'msg_iovlen'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>,
</span><span><span class="hljs-string">'msg_control'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_controllen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_flags'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>
);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$bytesReceived</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>, </span><span><span class="hljs-variable">$header</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bytesReceived</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"client ကိုထံမှမက်ဆေ့ခ်ျကိုလက်ခံရရှိခဲ့သည်: <span class="hljs-subst">$buffer</span></span></span><span>\n";
</span><span><span class="hljs-comment">// client ကိုတစ် ဦး တုံ့ပြန်မှုပေးပို့ပါ</span></span><span>
</span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
</span><span><span class="hljs-variable">$msgHdrSend</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
</span><span><span class="hljs-string">'msg_name'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_namelen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_iov'</span></span><span> => </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'iov_base'</span></span><span> => </span><span><span class="hljs-variable">$msg</span></span><span>, </span><span><span class="hljs-string">'iov_len'</span></span><span> => </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$msg</span></span><span>))),
</span><span><span class="hljs-string">'msg_iovlen'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>,
</span><span><span class="hljs-string">'msg_control'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>,
</span><span><span class="hljs-string">'msg_controllen'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>,
</span><span><span class="hljs-string">'msg_flags'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>
);
</span><span><span class="hljs-title function_ invoke__">socket_sendmsg</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>, </span><span><span class="hljs-variable">$msgHdrSend</span></span><span>);
}
</span></span>
Socket_sendmmmsg နှင့် Socket_recvmsg လုပ်ဆောင်ချက်များကို အသုံးပြု. Socket-based ဆက်သွယ်ရေးထိရောက်မှုကိုများစွာတိုးတက်စေနိုင်သည်။ သူတို့၏ပြောင်းလွယ်ပြင်လွယ်မှုသည် developer များက developer များကိုနှစ်လမ်းသွားဆက်သွယ်မှုကိုပိုမိုသိရှိရန်ခွင့်ပြုသည်။ ထိရောက်သောကွန်ယက်ဆက်သွယ်မှုကိုရရှိရန်ဤလုပ်ဆောင်ချက်များကိုမည်သို့အသုံးပြုသည်ကိုနားလည်ခြင်းသည်အလွန်အရေးကြီးသည်။