关于PHP创建多个Socket失败的问题(源码)

ZDNet软件频道 时间:2009-12-01 作者: | 甄焱鲲的博客 我要评论()
本文关键词:socket PHP
最近做的一个项目,有多个Server需要接收同一条UDP报文,通过TCPDump抓包,发现PHP中的三个Socket竟然只给发送了一个,另外两条UDP报文没有正确被发送,这里,通过各种尝试,最终没有找到问题的根源。
    最近做的一个项目,有多个Server需要接收同一条UDP报文,通过TCPDump抓包,发现PHP中的三个socket竟然只给发送了一个,另外两条UDP报文没有正确被发送,这里,通过各种尝试,最终没有找到问题的根源,于是,我猜想在同一个CGI中无法支持PHP创建指向多个IP和Port的socket(UDP),具体TCP协议需要再测试一下。最终,解决方案是将UDP报文在3个HTTP请求中按照不同参数发送三次,这样,在每次调用的时候要从Apache创建三个PHP的进程分别建立socket进行UDP报文的发送,结果,问题解决了,虽然是一个丑陋的方法,但是对于继续立刻解决问题来说,还是非常行之有效的,后续我会抽时间再关注一下这个问题,希望对于遇到类似问题的朋友有所帮助,最后附上我的PHP发送UDP的类源码:

<?PHP
//This class for use UDP socket connect your app
//Power by shadowkun
//Contact Email:shadowkun@tencent.com
class UdpMsg
{
    //IP and PORT for connect
    private $serverip;
    private $serverport;

    private $socket = -1;

    function __construct($serverip, $serverport)
    {
$this->serverip = $serverip;
$this->serverport = $serverport;
    }
    function __destruct()
    {
if(0 <= $this->socket)
{
     socket_close($this->socket);
}
    }

    function close()
    {
if(0 <= $this->socket)
{
     socket_close($this->socket);
}
    }


    function connect()
    {

if(($this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0)
{
     return -1;
}


socket_set_option($this->socket, SOL_socket, SO_RCVTIMEO, array('sec'=>5,'usec'=>0));


if(!socket_connect($this->socket, $this->serverip, $this->serverport))
{
     return -2;
}
return 0;
    }


    function send($sendStream, $len)
    {
if($this->socket < 0)
{
     return -1;
}

$ret = socket_write($this->socket, $sendStream, $len);
if($ret != $len)
{
     return -2;
}
return 0;
    }


    function recv(&$recvStream, $len)
    {
if($this->socket < 0)
{
     return -1;
}
$recvStream = socket_read($this->socket, $len, PHP_BINARY_READ);
//echo bin2hex($recvStream);
if(strlen($recvStream) == 0)
{
     return -2;
}
return 0;
    }
};

?>


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134