Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中检查UDP端口侦听与否?_Php_Sockets_Udp - Fatal编程技术网

如何在php中检查UDP端口侦听与否?

如何在php中检查UDP端口侦听与否?,php,sockets,udp,Php,Sockets,Udp,我在一个服务器上有一个监听UDP端口的服务。我如何检查我的服务是否仍然在这个端口上侦听php 我认为UDP是单向的,在创建连接时不返回任何内容(实际上没有连接:),我应该写入套接字 但是,无论我是否成功写入套接字,我都会收到“true” 我的代码: if(!$fp = fsockopen('udp://192.168.13.26', 9996, $errno, $errstr, 1)) { echo 'false'; } else { if(fwrite($fp, 'test'

我在一个服务器上有一个监听UDP端口的服务。我如何检查我的服务是否仍然在这个端口上侦听php

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

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

我的代码:

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官方文档所说

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);
}
$fp=fsockopen(“udp://192.168.13.26“,9996,$errno,$errstr);
如果(!$fp){
echo“错误:$errno-$errstr
\n”; }否则{ fwrite($fp,“\n”); echo-fread($fp,26); fclose($fp); }
您确实应该切换到库来创建套接字:

$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的性质,没有任何保证。

谢谢,但当服务侦听端口时,我收到一个错误(超过了30秒的最大执行时间),而当服务未侦听端口时,我什么也得不到。嗯。。。UDP是“单向的”。无法保证消息(如果发送)将永远到达。@MikeRobinson正确的UDP不发送确认您的代码不工作!我认为即使我们在socket上成功写入,服务器也不会发送任何消息,这是不安全的。官方文档还说,警告UDP套接字有时会显示打开时没有错误,即使无法访问远程主机。只有在向套接字读取或从套接字写入数据时,错误才会变得明显。这是因为UDP是一种“无连接”协议,这意味着操作系统在实际需要发送或接收数据之前不会尝试为套接字建立链接。编辑-我打字太快,今天早上一直在处理WebSocket@Dashwuff。此代码只能检查同一服务器上的套接字!是这样吗?有没有办法检查另一台服务器上的UDP端口?没错。另一台服务器正在广播消息吗?无法检查远程服务器以查看套接字是否打开。您必须向该服务器发送一条消息,并期望收到该服务器的响应。您知道,该服务器不广播任何内容,只侦听端口获取数据。您可以使用
socket\u sendto()
向该服务器发送一条消息,但无法保证收到(UDP就是这样工作的)。如果远程服务器没有广播或响应,则无法知道端口是否处于活动状态。