玩轉 PHP 網路程式設計全套之 socket 選項設定 API

勺顛顛發表於2020-04-25

先來看一個報錯

玩轉PHP網路程式設計全套之socket選項設定API
這種報錯非常常見,就是告訴你該地址已經被其它程式佔用了,你只能換個埠進行監聽,但是呢它真沒有處於佔用狀態,因為nestat -luntp時根本就沒有,出現這原因就是你剛stop它時,立馬啟動程式就會報這錯誤,實際上我們可以通過設定socket選項來解決這個小問題

socket選項設定與獲取

$ip = "0.0.0.0";
$port = $argv[1];
$sockefd = socket_create(AF_INET,SOCK_STREAM,0);
//set_option 一般在建立之後設定,針對監聽socket
socket_set_option($sockefd,SOL_SOCKET,SO_REUSEPORT,1);
socket_bind($sockefd,$ip,$port);
socket_listen($sockefd,5); 
//獲取在socket設定的選項
echo socket_get_option($sockefd,SOL_SOCKET,SO_REUSEPORT);
while (1){

    $connfd = socket_accept($sockefd);
    if ($connfd){
        socket_write($connfd,"hello,php 是世界上是好的語言");
        while (1){
            if(($recv=socket_read($connfd,4098,PHP_BINARY_READ))){
                socket_write($connfd,"server:$recv");
            }

        }
    }

}
socket_close($sockefd);
socket_close($connfd);

設定超時選項例子

$ip = "0.0.0.0";
$port = $argv[1];
$sockefd = socket_create(AF_INET,SOCK_STREAM,0);
socket_set_option($sockefd,SOL_SOCKET,SO_REUSEPORT,1);
socket_bind($sockefd,$ip,$port);
socket_listen($sockefd,5);

echo socket_get_option($sockefd,SOL_SOCKET,SO_REUSEPORT);
while (1){

    $connfd = socket_accept($sockefd);
    //sec 是秒  usec是微秒 
    //時間一到如果還沒有接收到資料就會出錯
    //socket_last_error 獲取socket出錯的資訊
    socket_set_option($connfd,SOL_SOCKET,SO_RCVTIMEO,['sec'=>2,'usec'=>0]);
    if ($connfd){
        socket_write($connfd,"hello,php 是世界上是好的語言");
        while (1){
            if(($recv=socket_read($connfd,4098,PHP_BINARY_READ))){
                socket_write($connfd,"server:$recv");
            }else{
//socket_last_error() 獲取連線socket出錯的程式碼 
//socket_strerror 對出錯程式碼解釋為字元
                echo socket_strerror(socket_last_error());
            }

        }
    }

}
socket_close($sockefd);
socket_close($connfd);
本作品採用《CC 協議》,轉載必須註明作者和本文連結

只會php crud的渣渣

相關文章