응용 프로그램의 몇 페이지에서 게임 서버에 소켓을 쿼리합니다. 페이지 사이를 너무 빠르게 탐색 할 때 소켓이 제대로 닫히지 않았고 오류가 발생하는 문제가 있습니다.소켓을 닫는 데 너무 오래 걸림
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
);
}
고마워요!
서버 코드를 샅샅이 뒤졌지만,이 동작의 보편성으로 판단 할 때, 서버의 동작은 매우 오랜 시간이었습니다. – Wug
좋아, 그게 정말 짜증나, 페이지로드 느린 롤을 만들 수 있습니다 : L –
답장을 보내 주셔서 감사합니다, 내가 뭔가를 3 초 페이지로드를 일시 중지 수 있습니다. –