php 로 소켓서버 하는 소스인데요.. --> server.php
#!/usr/local/bin/php -q
<?
set_time_limit(0);
define("_IP", "111.222.333.12");
define("_PORT", "8888");
$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sSock, _IP, _PORT);
socket_listen($sSock);
pcntl_signal(SIGCHLD, SIG_IGN);
while($sock = socket_accept($sSock))
{
socket_getpeername($sock, $sockIp, $sockPort);
msg("client connect :
".$sockIp.":".$sockPort."\n");
$pid = pcntl_fork();
msg("fork\n");
if($pid == -1)
{
msg("fork failed\n");
exit;
// 자식 프로세스 일때
}if($pid == 0)
{
while(1)
{
$buf = socket_read($sock, 4096);
// 접속 종료
if(!$buf)
{
msg("client connection broken :
".$sockIp.":".$sockPort."\n");
exit;
}
// 메시지 수신 이벤트
else
{
msg("recive data : ".$buf."\n");
$cmd = substr($buf, 0, 4);
switch($cmd)
{
// 시간전송
case "time":
msg("client(".$sockPort.") time data
request\n");
socket_write($sock, date("Y/m/d H:i:s"));
break;
// 종료
case "quit":
msg("client(".$sockPort.") quit
request\n");
socket_write($sock, "quit");
socket_close($sock);
exit;
break;
default:
msg("client(".$sockPort.") invalid command
$cmd\n");
break;
}
}
}
}
}
function msg($msg)
{
echo "SERVER >> ".$msg;
}
?>
이게 해보니 되기는 하는데, 클라이언트가 server.php 실행되고
있는 서버에 8888 포트로 최초 접속하고 아무입력 없이 가만히
있으면 server.php 에서도 자식프로세스가
무한정 살아있는 상태라는것과, $cmd 에 해당하는 클라이언트->
서버. 로 어떠한 메시지를 던지고 나서 아무것도 안하고 있으면
마찬가지로 무한정 대기 상태라는 문제가 있는데요..
처음접속시나 접속후, 어떠한 메시지를 던지로 나서 아무것도
안하고 00초 있으면 클라이언트 연결이 자동으로 끊어지도록
하는걸 해보려고 하는데 도무지 안되서요..
혹. 이 부분에 대해 처리방법을 아시는지 해서 문의드립니다..
|