PHP套接字随机断开连接

时间:2013-04-09 15:17:48

标签: php

我正在使用PHP套接字在端口6000上侦听传入连接,并且它在99%的时间内完美地工作,但是在向服务器发送请求时客户端获得连接错误的时间是1%。我创建了一个不同的脚本,在无限循环中每秒对端口6000上的套接字进行ping操作,并将结果写入日志文件,这样我就可以看到它是否破坏,78,000个成功ping,23失败。

我的代码必须有一些小的逻辑错误导致这种情况。如果有人有任何想法,我非常感激。

插口:

if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Couldn't create socket: [$errorcode] $errormsg \n");
}

echo "Socket created \n";

// Bind the source address
if( !socket_bind($sock, "0.0.0.0" , 6000) )
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not bind socket : [$errorcode] $errormsg \n");
}

echo "Socket bind OK \n";

if(!socket_listen ($sock , 10))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not listen on socket : [$errorcode] $errormsg \n");
}

echo "Socket listen OK \n";

echo "Waiting for incoming connections... \n";

//start loop to listen for incoming connections
while (true)
{
    //Accept incoming connection - This is a blocking call
    $client =  socket_accept($sock);

    //read data from the incoming socket
    $input = "";
    $input = socket_read($client, 10000000);

     if ($input != "")
     {
        // do my logic here with $input
     }
}
socket_close($sock);

编辑:不,我没有使用CMD来ping。这是我正在执行ping操作的PHP脚本:

<?php
$host = '0.0.0.0';
$port = 6000;
$waitTimeoutInSeconds = 1;
while(true)
{
   if($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds))
   {   
       $file = 'log.txt';
       $current = file_get_contents($file);
       $today = date("Y-m-d_H:i:s");  
       $current .= $today . " - SUCCESS\n";
       file_put_contents($file, $current);
   } 
   else 
   {
       $file = 'log.txt';
       $current = file_get_contents($file);
       $today = date("Y-m-d_H:i:s");  
       $current .= $today . " - FAILED\n";
       file_put_contents($file, $current);
   } 
   fclose($fp);
   sleep(1);
}
?>

对于实际的事务,客户端仅在原始文本中通过xml请求发送的瞬间连接,然后它执行一些不到一秒钟的逻辑。因为它在ping测试中失败了,这意味着我的听众因为某种原因打破了一秒钟而不是吗?

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确。

你说约有0.03%的ping失败了。这是你的问题吗?如果这些是真正的ping(来自cmd.exe的ping.exe),则它与您的逻辑无关。这是网络。 (主机是否在WIFI上?)

如果你确信这是你的逻辑: 如果有人连接,他连接了多长时间?连接到以前的客户端时,新请求会发生什么?我想你可以在这里找到答案。

还尝试与持续连接和发送虚拟数据的客户端进行测试,而不是ping。并记录客户端正在接收的响应。