当我尝试将套接字绑定到php中的localhost时,获取“已在使用中的地址”

时间:2011-04-11 18:54:23

标签: php sockets localhost

我正在尝试创建从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但我仍然收到地址不可用错误。

我做错了什么?

2 个答案:

答案 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