[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