先來看一個報錯
這種報錯非常常見,就是告訴你該地址已經被其它程式佔用了,你只能換個埠進行監聽,但是呢它真沒有處於佔用狀態,因為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 協議》,轉載必須註明作者和本文連結