2012-09-06 67 views
3

中循環,如果套接字按原樣響應,它會爲每個客戶端顯示「resource id#23」etc etc等不同的資源,但是當調用socket_write函數來寫入每個循環中都有相同的回顯消息,寫入功能失敗,並且只有一個客戶端獲得寫入消息(如果您提供輸入並提交,則會顯示一個輸入框,它會轉到套接字服務器併爲所有客戶端寫入d消息)當循環客戶端套接字數組時,無法在php套接字

<form method='GET' action=""> 
<input type='text' name='name' /> 
<input type='submit' /> 
</form> 
<?php 
$no=500;$n=0; 
$sock=null; 
if(!($sock=socket_create(AF_INET,SOCK_STREAM,0))) 
{ 
    $code=socket_last_error(); 
    $msg=socket_strerror($code); 
    die("ERROR $msg"); 
} 
echo "Socket created $sock"; 
/* 

$sock1=socket_create(AF_INET,SOCK_STREAM,0); 
socket_set_option($sock1, SOL_SOCKET, SO_REUSEADDR, 1) 
socket_connect($sock1,'localhost',9001); 
if(sizeof($_GET)>0) 
{ 
    $msg=$_GET['name']; 
    if(!socket_send($sock1,$msg,strlen($msg),0)) 
    { 
     $err=socket_last_error(); 
     $emessg=socket_strerror($err); 
     die("ERROR $emessg"); 
    } 
} 
*/ 
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) { 
    echo socket_strerror(socket_last_error($sock)); 
    exit; 
} 
if(!socket_bind($sock, "127.0.0.1" , 9001)) 
{ 
    $cod=socket_last_error(); 
    $msg=socket_strerror($cod); 
    die("ERROR:$msg"); 
} 
echo "Socket BOund"; 
if(!socket_listen($sock,10)) 
{ 
    $cod=socket_last_error(); 
    $msg=socket_strerror($cod); 
    die("ERROR:$msg"); 
} 
echo "Socket listen OK \n"; 
class clients{ 
public $addr=null,$portc=null,$soc=null; 
function __construct($sock1) { 
/*if(!($client[$n]=socket_create(AF_INET,SOCK_STREAM,0))) 
{ 
    $code=socket_last_error(); 
    $msg=socket_strerror($code); 
    die("ERROR $msg"); 
}*/ 
$this->soc=$sock1; 
if(socket_getpeername($this->soc,$address,$port)) 
{ 
    echo "$address in port $port"; 
    $this->addr=$address; 
    $this->portc=$port; 
} 
        } 

function sock(){return $this->soc;} 
}//$client[500]; 
$client=array(); 
while(true){ 
//$client[$n++]=socket_accept($sock); 
if($clienttemp=socket_accept($sock)) 
{ 
    $client[$n]=new clients($clienttemp); 
    echo "NEw client ".$client[$n]->addr; 
    $n++; 
    //var_dump($client[$n-1]); 
} 
for($j=0;$j<$n;$j++) 
//if($input=socket_read($client[$n-1]->soc,1024)) 
if($input=socket_read($client[$j]->soc,1024)) 
{ 
    //$resp="<br/>****".$client[$n-1]->addr." says: $input*****"; 
    $resp="<br/>****".$client[$j]->addr." says: $input*****"; 
    if($input=='quit')break; 
    for($i=0;$i<$n;$i++) 
{ 
    socket_write($client[$i]->soc,$resp); 
    echo "****</br>$resp".$client[$i]->soc."****</br>"; 
} 
} 

// TO write in all clients 


} 
socket_close($client[$n-1]->soc); 
socket_close($sock); 

?> 
+0

你在做什麼,你的問題是什麼? – Sjoerd

+0

應顯示即在所有客戶端寫消息 –

+0

如果您縮進並格式化代碼,它可能會有所幫助。我認爲你的問題在於:for($ j = 0; $ j <$ n; $ j ++),因爲for循環沒有開頭accolade({)。但是有點難以用這種混亂的代碼來說明.. – Johan

回答

0

Johan提到您的for循環沒有開放榮譽。在這種情況下,沒關係,因爲它只會執行下一個表達式,如果塊包含您的其餘邏輯,則恰好是塊。

雖然使用socket_strerrorsocket_last_error,您可能會看到問題。

在此代碼塊(格式化,而且有評論刪除):

for($j=0;$j<$n;$j++) 
    if($input=socket_read($client[$j]->soc,1024)) 
    { 
     $resp="<br/>****".$client[$j]->addr." says: $input*****"; 
     if($input=='quit')break; 
     for($i=0;$i<$n;$i++) 
     { 
     // Get write response 
     $sent = socket_write($client[$i]->soc,$resp); 
     // Check response for error 
     if($sent === false) 
     { 
      $err = socket_strerror(socket_last_error($client[$i]->soc)); 
      echo("\n $err \n"); 
     } 
     echo "****</br>$resp".$client[$i]->soc."****</br>"; 
     } 
    } 

這應該可以幫助您找出失敗的原因。