2012-09-06 4 views
3

을 루프 할 수 없습니다. 소켓이 에코 된 경우 "resource id # 23"등이 각 클라이언트마다 다른 리소스를 표시하지만 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 루프를위한 여는 찬사 ({)가 없기 때문이다. 그러나 다소 지저분한 코드로 이렇게 말하기는 어렵습니다. – Johan

답변

0

요한은 루프에 대한 개방의 영예가 없음을 언급했다. 이 예에서는 표현 만 실행하기 때문에 나머지 로직을 포함하는 블록 인 경우 일 수 있기 때문에 괜찮습니다.

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>"; 
     } 
    } 

당신은 실패의 원인을 식별합니다.