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