Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建基于套接字的PHP隧道脚本?_Php_Sockets - Fatal编程技术网

如何创建基于套接字的PHP隧道脚本?

如何创建基于套接字的PHP隧道脚本?,php,sockets,Php,Sockets,我尝试实现一个打开两个套接字的PHP脚本: sock1作为从外部连接的服务器套接字 sock2作为客户端套接字连接到无法从外部连接的内部服务 从外部读取的数据应写入内部,反之亦然。 最后,我用下面的代码停止了我的工作。注意:这不是很有效。我收到了一些来回的请求,但大部分时间都在为挂起socket\u read或不成功的socket\u write操作而挣扎 如何正确实现基于套接字的双向进出通信 <?php $sock1 = socket_create(AF_INET, SOCK_STRE

我尝试实现一个打开两个套接字的PHP脚本:

  • sock1
    作为从外部连接的服务器套接字
  • sock2
    作为客户端套接字连接到无法从外部连接的内部服务
  • 从外部读取的数据应写入内部,反之亦然。 最后,我用下面的代码停止了我的工作。注意:这不是很有效。我收到了一些来回的请求,但大部分时间都在为挂起socket\u read或不成功的socket\u write操作而挣扎

    如何正确实现基于套接字的双向进出通信

    <?php
    
    $sock1 = socket_create(AF_INET, SOCK_STREAM,  SOL_TCP) or die("Could not create socket 1");
    socket_bind($sock1, "127.0.0.1", 10001) or die("Could not bind to socket 1");
    socket_listen($sock1, 0) or die("Could not set up socket 1 listener");
    
    $sock2 = socket_create(AF_INET, SOCK_STREAM,  SOL_TCP) or die("Could not create socket 2");
    socket_connect($sock2, "127.0.0.1", 10002);
    
    $sock3 = socket_accept($sock1);
    socket_set_nonblock($sock3);
    
    while (!feof($sock3)) {
    
        while(true) {
            $extread = socket_read($sock3, 1024, PHP_BINARY_READ);
            if ($extread===FALSE || strlen($extread)==0) break;
            $result = socket_write($sock2, $extread);
            if ($result===FALSE) {
                break;
            }
        }
    
        while(true) {
            $dbread = socket_read($sock2, 1024, PHP_BINARY_READ);
            if ($dbread===FALSE || strlen($dbread)==0) break;
            $result = socket_write($sock3, $dbread);
            if ($result===FALSE) {
                break;
            }
        }
    }
    
    fclose($sock3);
    fclose($sock2);
    fclose($sock1);