我有一个用PHP编写的套接字服务器程序,由Fedora 21-apache运行,监听端口。
<?php
set_time_limit (0);
$address = '1.2.3.4';
$port = "19000";
$con = 1;
$word = "";
$sock = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$bind = socket_bind($sock, $address, $port) or die("Could not bind to socket\n");
socket_listen($sock);
while ($con == 1)
{
$client = socket_accept($sock);
$input = socket_read($client, 50);
if ($input == 'exit')
{
$close = socket_close($sock);
$con = 0;
}
else {
$input = trim($input) . "," . date('Y-m-d H:i:s') . "\n";
$file= "/home/xyz/data/" . "uls_" . date("Ymd_His") . ".dat";
file_put_contents($file, $input);
}
}
?>
客户端实际上是一个设备。目前只有一台设备在运行。 根据设备提供的文档, “它充当TCP客户端并打开到服务器的TCP套接字会话 然后,设备发送消息并断开套接字会话。连接失败强制重试“
现在我可以从这个客户端获取数据了。问题是,说4-5小时后客户端无法推送数据。服务器套接字挂起。 netstat -taun命令显示以下内容。
tcp 0 0 1.2.3.4:19000 0.0.0.0:* LISTEN
tcp 0 0 1.2.3.4:19000 3.4.5.6:20721 ESTABLISHED
有时可以看到多个客户端连接。
我可以确认客户端在此期间仍在运行。我试图通过另一个客户端套接字脚本连接到此服务器套接字。 结果说,客户端请求已经发出但服务器套接字没有响应。
如果重新启动Web服务器,并再次运行服务器脚本,则每次都可以正常工作。
任何人都可以帮我识别问题。
答案 0 :(得分:0)
我遇到同样的问题,我通过关闭socket_accept()
while ($con == 1)
{
$client = socket_accept($sock);
$input = socket_read($client, 50);
if ($input == 'exit')
{
$close = socket_close($sock);
$con = 0;
}
else {
$input = trim($input) . "," . date('Y-m-d H:i:s') . "\n";
$file= "/home/xyz/data/" . "uls_" . date("Ymd_His") . ".dat";
file_put_contents($file, $input);
}
// @param2 - 1 => block writing in socket ...
socket_shutdown ($client , 1) ;
socket_close ($client ) ;
}