用php模擬作服務端偵聽端口

 

參考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.htmlphp

 

http://blog.csdn.net/alongken2005/article/details/8056910html

 

socket_accept()是服務端接受客戶端請求,一旦有一個客戶端連接上來的話,則這個函數會返回一個新的socket資源,這個資源是與客戶端通訊的資源。linux

 socket_accept()是阻塞的,會一直卡在那裏。數組

 

 

發現狀況:一旦客戶端斷開連接了,會影響到服務端的主進程。如何避免這個影響呢?服務器

 

正常的服務器,應該是新開一個子進程來處理請求。app

 

socket_connect()是連接一個socket去。是客戶端使用的。socket

 

c語言的介紹:connect, send, recv都是同步阻塞工做模式。函數

 那麼,能夠得出結論,socket_connect()也是阻塞性的。spa

 

php中使用協程:操作系統

http://www.laruence.com/2015/05/28/3038.html

 

socket_recv和socket_read($msgsock, 2048, PHP_NORMAL_READ)

有什麼區別呢?

 

stream_select()

接受一個socket流,能夠多個,一個數組形式。

等待這些流改變了狀態。改變了狀態,則會返回大於0的一個值



<?php
/* Prepare the read array */
$read   = array($stream1, $stream2);//建立的兩個socket
$write  = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    /* Error handling */
} elseif ($num_changed_streams > 0) {
    /* At least on one of the streams something interesting happened */
}
?>


要使用引用傳遞,值會被修改。

 

php多路複用參考資料:http://blog.csdn.net/phphot/article/details/2020269

 

總結


若是沒有安裝socket擴展,則使用以下相關函數:stream_socket_client、fread()、fwrite()、stream_select()、fclose()

若是安裝了sokcet擴展,則能夠替換掉擴展的函數:

stream_socket_client等價於socket_create()

socket_select()等價於stream_select()

socket_close()等價於fclose()

socket_write()等價於fwrite()

socket_read()等價於fread()

 

stream_socket_client()其實是在調用linux系統的 connect()函數。

socket_select()、stream_select()都是在調用操做系統提供的select()函數。

 

 思考:stream和socket本質有什麼區別呢?

 不知道,想着去去思考socket_accept和socket_listen()區別,也許就能找到答案了。

 

我總把socket_accept和socket_listen()進行混淆了。

 

socket_accept是開始接受客戶端的連接,若是有客戶端連接上來,這個函數會返回一個socket通道的句柄,這個句柄是專門與客戶端單獨的句柄。socket_listen是開始偵聽這個socket通道,只是偵聽,並非接受客戶端的鏈接請求。

相關文章
相關標籤/搜索