现在有一个需求 需要用php来做一个数据包的转发功能, 具体需求:
监听本地某个端口(A、B均是通过这个端口进行通信的), 将A要发送的数据包转给B,将B要发送的数据包转给A。
就是这样,就是要用php来实现一个类似中转站的程序,请问大家有没有什么比较好的思路或者代码~  谢谢啦!! 

解决方案 »

  1.   

    可以去google一下php socket server,不过这个用PHP实现有点蛋疼,换Java或者C/C++吧
      

  2.   

    我已经goolge两天了 ,现在我能实现简单的数据转发,但是 代码总是阻塞到一个地方,导致后边的数据包没办法发了…… 我这怎么没法贴代码??!!
      

  3.   

    server端:<?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);
                }    }
    }
    ?>
      

  4.   

    client端:
    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个数据, 不知道为日……  求高手解释一下…… 
      

  5.   

    gearman 可以实现你需要的功能..还有队列.消息等机制.....socket都已经过时了.而且不稳定..最好采用curl
      

  6.   

    做二个接收文件,
    从a post---b  $_post 来接收
    从B post---A  $_post 来接收
      

  7.   

    谢谢大家了~   结贴啦~~ 
    使用socket_select($read, $write = NULL, $except = NULL, 0) >= 1
    这句 可以有效的防止阻塞的发生~~
      

  8.   

    谢谢大家啦~~ 结贴啦!!
    还是使用socket解决的
    socket_select($read, $write = NULL, $except = NULL, 0) >= 1
    这句能够解决阻塞问题~~