gpt4 book ai didi

php - 套接字关闭时间太长

转载 作者:搜寻专家 更新时间:2023-10-31 20:46:46 25 4
gpt4 key购买 nike

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

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
);
}

谢谢!

最佳答案

哇哦,具体的知识我知道很多!应该有一个 minecraft 标签。

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

因此,您的解决方案可能是将来自服务器的响应缓存 10 秒或 30 秒左右,这样服务器就不会拒绝它们。

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

关于php - 套接字关闭时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com