如何使用 PHP 和 fsockopen 检查 UDP 地址是不是存在?

Posted

技术标签:

【中文标题】如何使用 PHP 和 fsockopen 检查 UDP 地址是不是存在?【英文标题】:How to check a UDP address exists with PHP and fsockopen?如何使用 PHP 和 fsockopen 检查 UDP 地址是否存在? 【发布时间】:2012-05-31 16:37:49 【问题描述】:

我正在使用fsockopen 从 UDP 地址获取信息,唯一的问题是某些 UDP 地址可能仍然不活动。

我通过

创建套接字
$fp = fsockopen($tracker, $port, $errno, $errstr, 1);

如果地址有效,一切正常,但如果地址无效,则会生成此错误

Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in

我试过这样做,但它仍然会产生错误,

if(!$fp = fsockopen($tracker, $port, $errno, $errstr, 1)) 
     // ERROR
 else 
     // CONTINUE

我可以错误抑制它,一切都很好,但我不喜欢在我的代码中抑制错误。

如何确保任何给定的 UDP 地址在 php 中仍然处于活动状态?

谢谢

【问题讨论】:

我想知道是否有一个 PHP 设置来禁用套接字/流错误,就像你可以使用 libxml 和 cURL 一样。就像你说的,你也可以使用讨厌的老黑客@fsockeopen(...) 来压制它们。 如果我想使用 cURL 但它不支持 UDP 我会,至少我不知道该怎么做! 【参考方案1】:

您可以实现自己的错误处理程序,而不是抑制您可以执行的错误@。 set_error_handler

<?php
//Simple Blank error handler
set_error_handler('my_error_handler');
function my_error_handler($errno, $errstr, $errfile, $errline) 

function checkUDP($host,$port=80)
    //look no suppression
    $fp = fsockopen("udp://".$host, $port, $errno, $errstr,1.0);
    if (!$fp) 
        return false;
     else 
        fclose($fp);
        return true;
    


$good = 'tracker.publicbt.com';
$bad = 'trjjacker.publicbt.com';

if(checkUDP($good))
    echo $good.' Good';
else
    echo $good.' Bad';

echo '<br />';
if(checkUDP($bad))
    echo $bad.' Good';
else
    echo $bad.' Bad';


//tracker.publicbt.com Good
//trjjacker.publicbt.com Bad
?> 

【讨论】:

以上是关于如何使用 PHP 和 fsockopen 检查 UDP 地址是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

服务器如何开启php的fsockopen函数? 使用发邮箱类

如何让 SSL 在 fsockopen 中工作?

php fsockopen 函数在哪里定义?

PHP的fsockopen函数详解

如何使用 fsockopen() 使用密码打开 Telnet 连接?

PHP Socket编程 之使用fsockopen()函数