玩轉 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的渣渣

相關文章