【问题标题】:How to check UDP port listen or not in php?如何在 php 中检查 UDP 端口是否监听?
【发布时间】:2015-06-16 00:02:07
【问题描述】:

我在服务器上有一个服务,它监听 UDP 端口。如何通过 php 检查我的服务是否仍在此端口上侦听?

我认为 UDP 是单向的,在创建连接时不返回任何内容(实际上没有连接:)),我应该写入套接字。

但是,无论我是否成功写入套接字,我都会收到“真”!

我的代码:

if(!$fp = fsockopen('udp://192.168.13.26', 9996, $errno, $errstr, 1)) {
     echo 'false';
} else {
    if(fwrite($fp, 'test')){
        echo 'true';
    }else{
        echo 'false';
    }
}

您对此有什么建议吗?

【问题讨论】:

    标签: php sockets udp


    【解决方案1】:

    您真的应该切换到 Sockets 库来创建套接字:

    $ip = '192.168.13.26';
    // create a UDP socket
    if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
    
        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }
    
    // bind the source address
    if( !socket_bind($sock, $ip, 9996) ) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
    
        die("Could not bind socket : [$errorcode] $errormsg \n");
    }
    

    查看套接字是否仍然打开的唯一方法是向其发送消息,但鉴于 UDP 的性质,无法保证。

    【讨论】:

    • 已编辑 - 我打字太快了,今天早上一直在处理 websockets @duskwuff
    • 这段代码只能检查同一服务器上的socket!这样对吗?有没有办法检查另一台服务器上的 UDP 端口?
    • 没错。其他服务器是否在广播消息?无法检查远程服务器以查看套接字是否打开。您必须向该服务器发送一条消息并期待它的响应。
    • 谢谢,服务器不广播任何东西,只监听端口数据。
    • 您可以使用socket_sendto() 向该服务器发送消息,但不能保证收到(这就是UDP 的工作原理)。如果远程服务器没有广播或响应,则无法知道端口是否处于活动状态。
    【解决方案2】:

    正如PHP官方文档所说的

    fsockopen() 返回一个文件指针,它可以与 其他文件函数(如 fgets()、fgetss()、fwrite()、fclose()、 和 feof())。如果调用失败,它将返回 FALSE

    所以你可以这样做来检查错误

    $fp = fsockopen("udp://192.168.13.26", 9996, $errno, $errstr);
    if (!$fp) {
        echo "ERROR: $errno - $errstr<br />\n";
    } else {
        fwrite($fp, "\n");
        echo fread($fp, 26);
        fclose($fp);
    }
    

    【讨论】:

    • 谢谢,但是当服务监听端口时我得到一个错误(超过 30 秒的最大执行时间),当服务不监听端口时我什么也得不到。
    • 嗯嗯...... UDP “单向”。不保证消息,如果发送,将永远到达。
    • @MikeRobinson 正确 UDP 不发送确认
    • 您的代码不起作用!我认为即使我们在套接字上成功写入,服务器也没有发送任何内容
    • 不安全。官方文档还说,即使远程主机无法访问,有时也会出现警告 UDP 套接字已打开而没有错误。只有当您从套接字读取或写入数据时,该错误才会变得明显。这样做的原因是因为 UDP 是一种“无连接”协议,这意味着操作系统不会尝试为套接字建立链接,直到它真正需要发送或接收数据。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多