လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> 【 Socket_wsaprotocol_info_import ကိုအခြား PHP ကွန်ယက်လုပ်ဆောင်ချက်များနှင့်ပေါင်းစပ်သောအခါလက်တွေ့ကျသောအကြံဥာဏ်များကားအဘယ်နည်း။ 】

【 Socket_wsaprotocol_info_import ကိုအခြား PHP ကွန်ယက်လုပ်ဆောင်ချက်များနှင့်ပေါင်းစပ်သောအခါလက်တွေ့ကျသောအကြံဥာဏ်များကားအဘယ်နည်း။ 】

gitbox 2025-06-19

1 ။ Socket_wsaprotocol_info_import function ကိုနားလည်ပါ

ပထမ ဦး စွာ socket_wsaprotocol_info_import ၏အခြေခံလုပ်ဆောင်ချက်များကိုနားလည်ပါ။ WSA (Windows Socket API) protocol ကိုတင်သွင်းသော PHP တွင်ဤလုပ်ဆောင်ချက်သည် PHP ရှိကိရိယာတစ်ခုဖြစ်သည်။ ၎င်း၏အဓိကလုပ်ဆောင်ချက်မှာ Windows Socket Protocol ၏သတင်းအချက်အလက်များကို PHP Socket Protocol ၏သတင်းအချက်အလက်များကို PHP Socket ၏သတင်းအချက်အလက်များကို 0 င်းဒိုးစနစ်များတွင်ကွန်ယက်ပြ protocols အမျိုးမျိုးကိုပြောင်းလွယ်ပြင်သည်။

function ရှေ့ပြေးပုံစံ:

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$protocol_info</span></span><span> )
</span></span>
  • $ socket : ဖန်တီးထားတဲ့ socket အရင်းအမြစ်။

  • $ protocol_info : များသောအားဖြင့် socket_et_option နှင့်အခြားနည်းလမ်းများမှတဆင့်ရရှိသော protocol သတင်းအချက်အလက်အမှတ်အသား။

ဤလုပ်ဆောင်မှု၏ပြန်လာတန်ဖိုးသည်စစ်ဆင်ရေးအောင်မြင်မှုရှိမရှိညွှန်ပြနေသော boolean value တစ်ခုဖြစ်သည်။


2 ။ socket_create နှင့် socket_bind ကို ပိုမို granular control အောင်မြင်ရန်ပေါင်းစပ်ခြင်း

Windows Systems တွင် PHP Sockets ကိုအသုံးပြုသောအခါ socket_wsaprotocol_info_import ကိုအသုံးပြုသောအခါ socket_create နှင့် socket_bind ကဲ့သို့သောလုပ်ဆောင်ချက်များနှင့်အတူ socketets များကိုဖန်တီးရန်နှင့်ချည်နှောင်ရန်လိုအပ်သည်။ အောက်ဖော်ပြပါသည်ဘုံအသုံးပြုမှုမြင်ကွင်းဖြစ်သည်။

ဥပမာ - UDP socket တစ်ခုကိုဖန်တီးပြီး protocol ကိုချည်နှောင်ပါ

 <span><span><span class="hljs-comment">// a UDP Sockets</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_DGRAM, SOL_UDP);
</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">"创建Sockets失败: "</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-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}

</span><span><span class="hljs-comment">// တင်သွင်းသော protocol သတင်းအချက်အလက်များကိုတင်သွင်းပါ</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);

</span><span><span class="hljs-comment">// 绑定Sockets</span></span><span>
</span><span><span class="hljs-variable">$bind_result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'0.0.0.0'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$bind_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">"binding ပျက်ကွက်: "</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-string">"\n"</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">"UDP Sockets创建并绑定成功。\n"</span></span><span>;
</span></span>

ဤဥပမာတွင် UDP socket တစ်ခုကို ဦး စွာဖန်တီးပါ။ ထို့နောက် socket_et_et_option မှတဆင့် protocol သတင်းအချက်အလက်ကိုရယူပါ နောက်ဆုံးအနေဖြင့်ကျွန်ုပ်တို့သည် socket ကိုသတ်မှတ်ထားသော IP address နှင့် port သို့ချည်နှောင်ထားသည်။

ဤချဉ်းကပ်မှုကသင့်အားအထူးသဖြင့်တိကျသော protocol ကိုအသုံးပြုရန်လိုအပ်သည့်အခါဤချဉ်းကပ်မှုသည်သင့်အားပိုမိုနူးညံ့သိမ်မွေ့စွာထိန်းချုပ်ရန်ခွင့်ပြုသည်။


3 ။ ပိတ်ဆို့ခြင်းမရှိသော I / O ကိုအကောင်အထည်ဖော်ရန် Socket_select ကို သုံးပါ

PHP's Socket_Sock_select function ကသင့်အား socket မျိုးစုံအကြားရွေးချယ်ရန်ခွင့်ပြုသည်, ပိတ်ဆို့ခြင်းကိုရှောင်ရှားခြင်းမှရှောင်ရှားရန်ခွင့်ပြုသည်။ ထိရောက်သောကွန်ယက်အသုံးချပရိုဂရမ်များကိုအကောင်အထည်ဖော်သည့်အခါ၎င်းသည်တစ်ချိန်တည်းတွင် connection တောင်းဆိုမှုများကိုတစ်ချိန်တည်းတွင်ကိုင်တွယ်ရန်ခွင့်ပြုသည်။

ဥပမာ - client-server ဆက်သွယ်ရေး Non- ပိတ်ဆို့ခြင်း

 <span><span><span class="hljs-comment">// a TCP Sockets</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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$serverSocket</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">"创建Sockets失败: "</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-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}

</span><span><span class="hljs-comment">// တင်သွင်းသော protocol သတင်းအချက်အလက်များကိုတင်သွင်းပါ</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</span></span><span>);

</span><span><span class="hljs-comment">// ချည်နှောင်ခြင်းနှင့်နားထောင်ကြလော့</span></span><span>
</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">'0.0.0.0'</span></span><span>, </span><span><span class="hljs-number">8081</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">// Non-blocking ကိုသတ်မှတ်</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$serverSocket</span></span><span>);

</span><span><span class="hljs-variable">$clients</span></span><span> = [</span><span><span class="hljs-variable">$serverSocket</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">$read</span></span><span> = </span><span><span class="hljs-variable">$clients</span></span><span>;
    </span><span><span class="hljs-variable">$write</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
    </span><span><span class="hljs-variable">$except</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
    
    </span><span><span class="hljs-comment">// အသုံးပြု socket_select ပိတ်ပင်တားဆီးမှု non- ပိတ်ဆို့ခြင်း</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>) &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$read</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$socket</span></span><span>) {
            </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-variable">$serverSocket</span></span><span>) {
                </span><span><span class="hljs-comment">// ဆက်သွယ်မှုအသစ်များကိုလက်ခံပါ</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-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>);
                </span><span><span class="hljs-variable">$clients</span></span><span>[] = </span><span><span class="hljs-variable">$clientSocket</span></span><span>;
            } </span><span><span class="hljs-keyword">else</span></span><span> {
                </span><span><span class="hljs-comment">// client data ကိုဖတ်ပါ</span></span><span>
                </span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
                </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-string">""</span></span><span>) {
                    </span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
                    </span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$clients</span></span><span>[</span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$clients</span></span><span>)]);
                } </span><span><span class="hljs-keyword">else</span></span><span> {
                    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"client ကိုဒေတာကိုလက်ခံရရှိခဲ့သည်: "</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
                    </span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"ခံယူ: "</span></span><span> . </span><span><span class="hljs-variable">$data</span></span><span>);
                }
            }
        }
    }
}
</span></span>

ဤဥပမာတွင်ဆာဗာသည် TCP socket တစ်ခုဖန်တီးပြီးပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ပြီး socket_select လုပ်ခြင်းမပြုပါ။ Socket_wsaprotocol_info_import နှင့်ပေါင်းစပ်ပြီး Socket Socket Bociety ကိုအကောင်းဆုံးဖြစ်စေရန်တိကျသော protocols များကိုသင်ပြောင်းလွယ်ပြင်လွယ်ပြုနိုင်သည်။


4 ။ ထိရောက်သောဒေတာထုတ်လွှင့်မှုကိုအောင်မြင်ရန် Socket_recv နှင့် Socket_send နှင့်ပူးပေါင်းပါ

Socket_recv နှင့် Socket_send လုပ်ဆောင်ချက်များအားဖြင့်ထိရောက်သောကွန်ယက်မှအချက်အလက်ထုတ်လွှင့်ခြင်းကိုပြုလုပ်နိုင်သည်။ Socket_wsaprotocol_info_import ဖြင့်အသုံးပြုသောအခါဒေတာထုတ်လွှင့်မှုသည်ပိုမိုတည်ငြိမ်စေရန်သေချာစေရန်သေချာစေရန် protocol လိုအပ်ချက်များနှင့်အညီ socket beaction ကိုချိန်ညှိနိုင်သည်။

ဥပမာ - protocol alment information ကို အသုံးပြု. ဒေတာထုတ်လွှင့်မှုကိုအကောင်းမြင်ပါ

 <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">"创建Sockets失败: "</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-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}

</span><span><span class="hljs-comment">// တင်သွင်းသော protocol သတင်းအချက်အလက်များကိုတင်သွင်းပါ</span></span><span>
</span><span><span class="hljs-variable">$protocol_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_PROTOCOL_INFO);
</span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$protocol_info</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_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</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-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-string">"\n"</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">$message</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_send</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</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">$buffer</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_recv</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$buffer</span></span><span>, </span><span><span class="hljs-number">2048</span></span><span>, </span><span><span class="hljs-number">0</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">$buffer</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;

</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

ဤဥပမာတွင် Socket_send မှတစ်ဆင့်ဒေတာများကိုပေးပို့ပြီး Socket_recv မှတဆင့်တုံ့ပြန်မှုအချက်အလက်များကိုလက်ခံရရှိသည်။ Socket_wsaprotocol_info_import နှင့်ပေါင်းစပ်။ Socket Protocol Information ကိုကွဲပြားခြားနားသော protocols များ၏လိုအပ်ချက်နှင့်အညီကောင်းမွန်စေနိုင်သည်။