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);
?>
당신은 무엇을하려고합니까? 그리고 당신의 질문은 무엇입니까? – Sjoerd
모든 클라이언트에 메시지를 표시 즉 표시해야합니다. –
코드를 들여 쓰기하고 서식을 지정하면 도움이 될 수 있습니다. 나는 당신의 문제가 줄에 있다고 생각한다 : for ($ j = 0; $ j <$ n; $ j ++) for 루프를위한 여는 찬사 ({)가 없기 때문이다. 그러나 다소 지저분한 코드로 이렇게 말하기는 어렵습니다. – Johan