我试图创建一个从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
成功,但我仍然得到地址不可用错误。
我做错了什么?
2条答案
按热度按时间vfh0ocws1#
socket_bind
用于绑定本地机器上的套接字。绑定套接字意味着为套接字保留地址/端口。你通常使用它作为监听器(服务器)而不是客户端。在本例中,由于服务器(Qt)已经启动,因此地址已经在使用中,因此socket_bind
将失败。如果你想 * 连接到一个socket*,使用
socket_connect
:字符串
如果要连接到本地套接字(即:通过套接字文件,而不是通过TCP/UDP):
型
vs91vp4v2#
第一个清除使用端口:
字符串