ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

套接字花费太长时间才能关闭

2019-11-27 17:30:34  阅读:226  来源: 互联网

标签:minecraft sockets php


我在应用程序的几页上有套接字查询游戏服务器.我有一个问题,当我在页面之间浏览太快时,套接字没有正确关闭,我得到的错误是这样的;

socket_recv() [function.socket-recv]: unable to read from socket [104]: Connection reset by peer

每页完全加载后,我必须等待4-5秒钟左右才能关闭.

这是套接字的代码;

function QueryMinecraft( $IP, $Port, $Timeout =1 )
{
    $Socket = Socket_Create( AF_INET, SOCK_STREAM, SOL_TCP );

    Socket_Set_Option( $Socket, SOL_SOCKET, SO_SNDTIMEO, array( 'sec' => (int)$Timeout, 'usec' => 0 ) );

    if( $Socket === FALSE || @Socket_Connect( $Socket, $IP, (int)$Port ) === FALSE )
    {
        Socket_Close( $Socket );
        return FALSE;
    } else {
        Socket_Close( $Socket );
        return TRUE;
    }      
    Socket_Close( $Socket );                  
}   

这是另一页上套接字的代码;

function QueryMinecraft( $IP, $Port, $Timeout = 3 )
{
    $Socket = Socket_Create( AF_INET, SOCK_STREAM, SOL_TCP );

    Socket_Set_Option( $Socket, SOL_SOCKET, SO_SNDTIMEO, array( 'sec' => (int)$Timeout, 'usec' => 0 ) );

    if( $Socket === FALSE || @Socket_Connect( $Socket, $IP, (int)$Port ) === FALSE )
    {
        return FALSE;
    }

    Socket_Send( $Socket, "\xFE", 1, 0 );
    $Len = Socket_Recv( $Socket, $Data,256, 0 );


    if( $Len < 4 || $Data[ 0 ] != "\xFF" )
    {
        return FALSE;
    }

    $Data = SubStr( $Data, 3 );
    $Data = iconv( 'UTF-16BE', 'UTF-8', $Data );
    $Data = Explode( "\xA7", $Data );

    return Array(
        'HostName'   => SubStr( $Data[ 0 ], 0, -1 ),
        'Players'    => isset( $Data[ 1 ] ) ? IntVal( $Data[ 1 ] ) : 0,
        'MaxPlayers' => isset( $Data[ 2 ] ) ? IntVal( $Data[ 2 ] ) : 0
    );
}

谢谢!

解决方法:

哇,我了解很多特定的知识!应该有一个我的世界标签.

我相信这实际上是我的世界服务器的限制,而不是您的php代码有问题.您可能会注意到,如果您使用的是Minecraft客户端,并且快速访问了多人游戏页面几次,您将遇到相同的问题(用于查询玩家数量和MOTD的服务器连接将被拒绝).如果您在两次访问之间等待5或6秒钟,它将自行解决.

因此,您的解决方案可能是将服务器的响应缓存10秒钟或30秒钟左右,以便服务器不会拒绝它们.

我不知道您是否可以使用本地SQL数据库,但是您应该可以设置一个包含服务器ip(不是主机名,也不保证是唯一的主机名)的表.IP也不是但最好的选择)是MOTD,当前和最大玩家数以及最后检查的时间戳.您可以简单地进行数据库查询,检查时间戳以确保高速缓存的值尚未过期,如果已过期,则直接查询服务器并将结果存储在数据库中.

标签:minecraft,sockets,php
来源: https://codeday.me/bug/20191127/2076016.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有