on
[PHP] Socket Server Code
[PHP] Socket Server Code
php
$address = "127.0.0.1" ;
$port = 9001 ;
$c_sock = array ();
$c_info = array ();
$s_sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ( $s_sock = = = false ){
echo "socket_create() Error! reason :" .socket_strerror(socket_last_error()) . "
" ;
echo "" ;
} else {
echo "소켓 생성 성공" ;
}
//서버 소켓에 주소와 포트번호 부여
socket_bind( $s_sock , $address , $port ) or die( 'Could not bind to address' );
//서버 소켓을 클라이언트 대기 상태로 만듦
socket_listen( $s_sock );
while ( true ){
$sockArr = array_merge ( array ( $s_sock ), $c_sock );
//소켓 이벤트 대기
if (socket_select( $sockArr , $tWrite = NULL , $tExcept = NULL , 10 ) > 0 ){
foreach( $sockArr as $sock ){
//새로운 클라이언트 접속
if ( $sock = = $s_sock ){
//접속 허용
$t_socket = socket_accept( $s_sock );
//클라이언트 접속정보 가져오기
socket_getpeername( $t_socket , $sock_ip , $sock_port );
//해당 클라이언트 접속정보를 소켓배열에 input
$c_sock [ $t_socket ] = $t_socket ;
$c_info [ $t_socket ] = array ( 'ip' = > $sock_ip , 'port' = > $sock_port );
msg( "client connect : " . $sockIp . ":" . $sockPort . "
" );
} else { //접속해있는 클라이언트일경우 이벤트발생함을 의미
$buf = socket_read( $sock , 4096 );
//접속종료
if ( ! $buf ){
exceptSocket( & $c_sock , & $c_info , $sock );
msg( "client connection broken : " . $sockIp . ":" . $sockPort . "
" );
} else { //이벤트 작성
$in = "hello socket server!!" ;
socket_write( $sock , $in );
socket_close( $$sock );
}
}
}
}
}
function exceptSocket( & $sockSet , & $infoSet , $sock )
{
unset( $sockSet [ $sock ]);
unset( $infoSet [ $sock ]);
// array_merge 함수에서 error 발생을 막기위한 처리
if ( count ( $sockSet ) = = 0 )
{
$sockSet = array ();
$infoSet = array ();
}
}
function msg( $msg ){
echo "SERVER >> " . $msg ;
}
from http://ganbarujoy.tistory.com/154 by ccl(A) rewrite - 2021-10-19 19:00:33