我见过这个问题的其他人,但也许我可以解释我的情况,你可以指出问题可能出在哪里。PHP:TCP套接字,'无法绑定地址'
我得到一个'警告:socket_bind():无法绑定地址[98]:地址已被使用'错误。
情况就是这样。我正在使用Web应用程序来触发另一个程序执行任务(从网页界面)。该程序的结果通过套接字发送到正在套接字上侦听的我的Web应用程序。
首先我创建并打开套接字,然后我触发另一个程序,然后当程序结束时它应该通过套接字发回它的结果。
它工作正常的第一次尝试。然后下一次尝试(我多次触发此过程)当我尝试打开套接字时,出现上述套接字绑定错误,显然套接字仍然绑定。
我等了大约一分钟,我可以再次成功运行该过程。我认为套接字连接超时。
我不知道问题是因为我的结构我的套接字代码的方式,或者如果问题是在我触发的外部程序。我不太了解外部程序的内部,因为它是由其他人创建的jar文件。
继承人我用于创建和处理套接字的代码。我刚刚在php.net上使用了一个例子,并根据我的需要对其进行了修改。
$port1 = 15000;
// configure the socket
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$address = '127.0.0.1';
$port2 = 54321;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$error = 'none';
if ($sock) {
if (socket_bind($sock, $address, $port2)) {
if (socket_listen($sock, 5)) {
// trigger external process
if (start_calibration()) {
$buf = array();
// listen to the socket for incoming messages
do {
// if incomming connection is not accepted break out and close socket
if (($msgsock = socket_accept($sock)) === false) {
break;
}
do {
// if cant read socket then break out and close socket
if (false === ($buf = socket_read($msgsock, 2048, PHP_BINARY_READ))) {
break 2;
}
$buf = unpack('C*', $buf);
socket_close($msgsock);
break 2;
} while (true);
socket_close($msgsock);
} while (true);
socket_close($sock);
// code to handle data recieved through the socket
}
else {
// start_calibration failed
$error = 'start_calibration failed';
socket_close($sock);
}
}
else {
// socket_listen failed
$error = 'socket_listen failed';
socket_close($sock);
}
}
else {
// socket_bind failed
$error = 'socket_bind failed';
socket_close($sock);
}
}
else {
// socket_create failed
$error = 'socket_create failed';
}
$data['error'] = $error;
echo json_encode($data);
此外,有没有是处理插座的关闭,如果有是一个像“socket_bind”,“socket_listen”等线路问题的一种更有效的方式?
这是一个CLI脚本吗?如果是这样,运行一次,然后它是一个侦听端口的小型服务器。如果您的操作系统内核支持同时在同一个端口上侦听多个进程,您可以尝试重用地址。但是,整个架构的结构似乎有些不同。 –