4

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

  1. sock1作为从外部连接的服务器套接字
  2. sock2作为无法从外部连接的内部服务的客户端套接字

从外部读取的数据应写入内部,反之亦然。最后,我基本上用以下代码停止了我的工作。注意:这工作不稳健。我来回收到了一些请求,但大多数时候都在为挂起 socket_read 或不成功的 socket_write 操作而苦苦挣扎。

如何正确实现基于套接字的双向 in <-> out 通信?

<?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);
4

0 回答 0