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

  • 相关阅读:
    Windows Phone 在读取网络图片之前先显示默认图片
    ios开发 点击文本(TextField)输入的时候向上推以及输入之后恢复的动画
    51nod 1019 逆序数
    hdu 5455 Fang Fang
    51nod 1027 大数乘法
    51nod 1006 最长公共子序列Lcs
    51nod 1066 Bash游戏
    51nod 1069 Nim游戏
    51nod 1049 最大子段和
    51nod 1072 威佐夫游戏
  • 原文地址:https://www.cnblogs.com/lein317/p/5067587.html
Copyright © 2011-2022 走看看