개발을 간바루Joy 하게

[PHP] Socket Server Code 본문

프로그래밍/PHP

[PHP] Socket Server Code

New! Game 2021. 10. 19. 18:32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
php<?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()) . "\n";
        echo "<br/>";
    }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 = NULL10> 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."\n");
                }else//접속해있는 클라이언트일경우 이벤트발생함을 의미
                    $buf = socket_read($sock4096);
 
                    //접속종료
                    if(!$buf){
                        exceptSocket(&$c_sock&$c_info$sock);
                        msg("client connection broken : ".$sockIp.":".$sockPort."\n");                        
                    }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;
    }
    
 
?>
cs