我试图实现一个打开两个套接字的 PHP 脚本:
sock1
作为从外部连接的服务器套接字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);