我正在尝试创建从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 =根 警告:socket_bind():无法绑定地址[98]:第28行的/var/www/nbr/socket.php中已经使用的地址socket_bind()失败:原因:地址已在使用中
我已经尝试了许多能够指出问题可能是什么的东西,但不是如何解决它。当我尝试回显地址和端口信息时,socket_getsockname产生垃圾,但如果我将AF_UNIX
更改为AF_INET
,并添加
$addr = ""; $pt = "";
echo "Socket name ok: " . socket_getsockname($sock, &$addr, &$pt) . '<br/>';
echo $addr . ", " . $pt . '<br/>';
结果是
套接字名称ok:1
0.0.0.0,0
地址/端口是否从未以某种方式正确设置?此外,后续socket_get_option($sock, 0, SO_REUSEADDR)
因AF_UNIX
失败,成功AF_INET
但我仍然收到地址不可用错误。
我做错了什么?
答案 0 :(得分:2)
socket_bind
用于绑定本地计算机上的套接字。绑定套接字意味着为套接字保留地址/端口。您通常将它用于侦听器(服务器)而不是客户端。在您的情况下,由于服务器(Qt)已经启动,因此该地址已被使用,因此socket_bind
将失败。
如果您想连接到套接字,请使用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');
}
答案 1 :(得分:0)
第一个明确使用端口:
<?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