现在有一个需求 需要用php来做一个数据包的转发功能, 具体需求:
监听本地某个端口(A、B均是通过这个端口进行通信的), 将A要发送的数据包转给B,将B要发送的数据包转给A。
就是这样,就是要用php来实现一个类似中转站的程序,请问大家有没有什么比较好的思路或者代码~ 谢谢啦!!
监听本地某个端口(A、B均是通过这个端口进行通信的), 将A要发送的数据包转给B,将B要发送的数据包转给A。
就是这样,就是要用php来实现一个类似中转站的程序,请问大家有没有什么比较好的思路或者代码~ 谢谢啦!!
if (true){
//if(isset($_POST['submit'])){
$i = 1;
ignore_user_abort(true);
set_time_limit(100*60); //确保在连接客户端时不会超时
$address = '127.0.0.1'; //设置IP
$port = 65534; //端口号,调试的时候,可以多换端口来测试程序!
/*if(!($sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)))exit; //创建一个SOCKETif(!($ret=socket_bind($sock,$address,$port)))exit; //绑定到socket端口
socket_close($ret);*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("创建失败"); //创建一个SOCKET
$ret = socket_bind($sock, $address, $port) or die("绑定失败");
socket_listen($sock, 4); //开始监听
while (true) {
if ($i <= 2) {
if ($i == 1) {
$souce1 = socket_accept($sock);
$buf1 = socket_read($souce1, 8192); //将接收到的资源$msgsock用socket_read每次8192的大小读到$buf中
socket_write($souce1, $buf1); //向client端返回向要的信息(可有可无)
$i ++; }
if ($i == 2) {
$souce2 = socket_accept($sock);
$buf2 = socket_read($souce2, 8192); //将接收到的资源$msgsock用socket_read每次8192的大小读到$buf中
socket_write($souce2, $buf2); //向client端返回向要的信息(可有可无)
$i ++; break;
}
}
}
// echo "读取客户端第一次发来的信息<p>";
while (true) {
//以下是用来接收client(客户)端传来的信息,然后进行转发
//sleep(1); $buf1 = socket_read($souce1, 8192);
if ($buf1 != null && $buf1 != false &&$buf1!="") {
socket_write($souce2, $buf1);
} $buf2 = socket_read($souce2, 8192);
if ($buf2 != null && $buf2 != false && $buf2!="") {
socket_write($souce1, $buf2);
} }
}
?>
error_reporting(E_ALL);
set_time_limit(0);
echo "<h2>TCP/IP Connection</h2><p>";$service_port = 65534; //连接的端口号,与服务端的端口要一致
$address = "127.0.0.1"; //设置IPif(!($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)))exit; //创建一个SOCKET
else echo "SOCKET创建OK.<p>";
echo "试图连接 $address 端口:$service_port...<p>";$result = socket_connect($socket, $address, $service_port); //开始连接
if ($result < 0)exit;
else echo "连接OK<p>"; //想要向服务器传送的消息for ($i=0;$i<=100;$i++){
socket_write($socket, "1__".$i."\r\n",1024);
echo socket_read($socket, 8192);
}
socket_close($socket);
但是 现在代码总是阻塞到第61个数据, 不知道为日…… 求高手解释一下……
从a post---b $_post 来接收
从B post---A $_post 来接收
使用socket_select($read, $write = NULL, $except = NULL, 0) >= 1
这句 可以有效的防止阻塞的发生~~
还是使用socket解决的
socket_select($read, $write = NULL, $except = NULL, 0) >= 1
这句能够解决阻塞问题~~