当我尝试将套接字绑定到php中的localhost时,获取'Address already in use'

xggvc2p6  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(106)

我试图创建一个从php脚本到本地服务器(Qt,QLocalServer)的套接字连接,但我在php端创建连接时遇到了麻烦。

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');

set_time_limit(0);
ob_implicit_flush();

echo 'usr='. get_current_user().'<br/>';

$address = 'localhost';
$port = 4444; //Different port numbers produce same result

if (($sock = socket_create(AF_UNIX, SOCK_STREAM, 0)) === false) 
{
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit();
}

 if (socket_bind($sock, $address, $port) === false) 
{
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
    exit();
}

...

字符串
这导致
usr=root警告:socket_bind():无法绑定地址[98]:地址已经在使用中/var/www/nbr/socket. php第28行socket_bind()failed:原因:地址已在使用中
我尝试了很多方法,这些方法给予说明问题可能是什么,但没有说明如何解决它。socket_getsockname在我尝试回显地址和端口信息时产生垃圾,但是如果我将AF_UNIX更改为AF_INET,并添加

$addr = ""; $pt = "";    
echo "Socket name ok: " . socket_getsockname($sock, &$addr, &$pt) . '<br/>';
echo $addr .    ", " . $pt . '<br/>';


结果是
套接字名称确定:1
0.0.0.0,0
那么地址/端口是不是从来没有正确设置过?此外,后续的socket_get_option($sock, 0, SO_REUSEADDR)失败,AF_UNIX成功,AF_INET成功,但我仍然得到地址不可用错误。
我做错了什么?

vfh0ocws

vfh0ocws1#

socket_bind用于绑定本地机器上的套接字。绑定套接字意味着为套接字保留地址/端口。你通常使用它作为监听器(服务器)而不是客户端。在本例中,由于服务器(Qt)已经启动,因此地址已经在使用中,因此socket_bind将失败。
如果你想 * 连接到一个socket*,使用socket_connect

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_connect($socket, 'localhost', 4444)) {
    die('failed');
}

字符串
如果要连接到本地套接字(即:通过套接字文件,而不是通过TCP/UDP):

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if (!socket_connect($socket, '/var/run/mysqld/mysqld.sock')) {
    die('failed');
}

vs91vp4v

vs91vp4v2#

第一个清除使用端口:

<?PHP
$port= 4444;
$cmd = explode("*", str_replace(array("/"), "*",
    str_replace(" ","",shell_exec("netstat -tulpn | grep :".$port))));
if (count($cmd)>1) {  //if found use port
    shell_exec("kill -9 " . $cmd[1]);
}
.
.
.
.code

字符串

相关问题