zoukankan      html  css  js  c++  java
  • 最简单的PHP socket echo server。

    常有人困惑php的socket服务,现在有libevent和多线程了,但是我还是整一个select的

    <?php
    $addr = '0.0.0.0';
    $port = 1234;
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    
    if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
        echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
    }
    
    if($socket < 0) {
    	echo "Socket create:".$socket_strerror($socket)."
    ";
    	exit;
    }
    
    if (! ($ret = socket_bind($socket, $addr, $port)) ) {
    	$cmd =isset($_SERVER['WINDIR'])? "netstat -an -o | find "".$port.""":"netstat -anp | grep "".$port.""";
    	$output = NULL;
    	exec( $cmd, $output , $return_var);
    	echo "
    	-----------------------------------------------		
    	$cmd		
    	<pre>";
    	var_dump($output, $return_var);
    	echo "/<pre>";
        //echo "//AS!
    ";
        exit;
    }
    
    if ( ($ret = socket_listen($socket, 5)) < 0 ) {
        echo "socket listen:".socket_strerror()."
    ";
        exit;
    }
    
    socket_set_nonblock($socket);
    
    $clients = array($socket);
    while(true) {
    	$read = $clients;
    	$writes=NULL;$execs=NULL;
    	if(socket_select($read, $writes, $execs, 2) < 1){		
    		echo ".";
    		continue;
    	}
    	
    	if(in_array($socket,$read)) {
    		$newsock = socket_accept($socket);
    		socket_set_nonblock($newsock);
    		socket_getpeername($newsock,$remoteIP,$remotePort);		
    		$userSN = $remoteIP.'_'.$remotePort;
    		echo $userSN.' connetect in'.chr(10);
    		$clients[$userSN] = $newsock;
    		socket_write($newsock,'welcome '.$userSN.chr(10));
    		continue;
    	}
        
        foreach($read as $read_sock) {
    		$data = @socket_read($read_sock, 2048, PHP_BINARY_READ);
    		$data = trim($data);
    		if(strlen($data) == 2048){
    			socket_close($read_sock);
    			continue;
    		}
    		@socket_getpeername($read_sock, $remoteIP, $remotePort);	
    		$userSN = $remoteIP.'_'.$remotePort;
            echo $userSN.' say:'.$data.chr(10);
    		socket_write($read_sock,'you say:'.$data);
        }
    }


     

    php s1.php

    telnet 127.0.0.1 1234

    telnet 127.0.0.1 1234

  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/lein317/p/5067587.html
Copyright © 2011-2022 走看看