2011-11-08 7 views
2

고객 중 한 명이 fsockopen()을 사용하여 서버가 온라인 상태인지 아닌지를 결정하는 매우 간단한 스크립트를 가지고 있다고 말했습니다. 그들은 최근까지 우리 웹 사이트에서 정상적으로 작동했지만 최근에는 작업이 중단되어 설정이라고 가정합니다.특정 웹 호스트에서 fsockopen()이 작동하지 않습니까?

내 첫 번째 생각은 TCP로 사용하고 게임 서버에 IP/포트를 사용했지만 그와 나 자신은 스크립트가 다른 여러 웹 호스트에서 제대로 작동했음을 확인했습니다.

특별히 우리에게 어떤 문제가있을 수 있습니까?

작품 : http://crazygfl.xfactorservers.com/query.php?ip=www.xfactorservers.com&port=80

작품 : http://crazygfl-stats.com/query.php?ip=109.73.163.231&port=27015

작동하지 않습니다 여기에

http://crazygfl.xfactorservers.com/query.php?ip=109.73.163.231&port=27015 코드입니다 ...

<?php 

    $timeout = (isset($_GET['timeout']) ? ($_GET['timeout'] <= 0 ? 30 : ((int)$_GET['timeout'])) : 30); 

    if(empty($_GET['ip'])&&empty($_GET['port'])){ 
     echo 'No IP/Port specified.'; 
    }else{ 
     if(fsockopen($_GET['ip'], $_GET['port'], $errno, $errstr, $timeout) === false){ 
      echo 'offline'; 
     }else{ 
      echo 'online'; 
     } 
    } 
+0

fsockopen 기능이 비활성화되어 있지 않습니까? –

+0

은 현명하고 정통한 사람이 다른 사람과 작동하지 않는 호스트의 요청을 차단했습니다 (다른 IP에 있다고 가정). 그 일관성없는 행동을 설명 할 것입니다 – sdolgy

+0

"작품"/ "작동하지 않는"당신은 무엇을 의미합니까 메시지를 반환하지만 예상 하나? 출력이 없습니까? 시간 초과 되었습니까? – symcbean

답변

4

그것은 호스팅 업체가 사용할 수있는 가능성이 있습니다 fsockopen 함수 또는 테스트하려는 포트의 방화벽 된 아웃 바운드 요청. 이 경우 함수를 다시 활성화하거나 포트의 차단을 해제하도록 요청할 수 있지만, 그렇지 않은 경우 새 호스트로 이동하는 것 외에 다른 수단은 없습니다.

현재 유효성 검사없이 사용자 입력 ($ _GET, $ _POST 등)에서 직접 데이터를 사용하는 것은 아주 나쁜 생각입니다!

+0

사실 우리는 호스트입니다. 그러나 웹 호스팅은 추가 인센티브로서 고객에게 무료로 제공하는 부가 서비스입니다. 불행히도, 우리의 웹 마스터는 최고의 영어를 말하지 않기 때문에, 나는 그와 함께 그것을 해결하려고 노력하는 것보다는 단지 해결책으로 그를 접근하는 것이 더 낫습니다. 스크립트가 우리 호스팅의 다른 포트와 작동하기 때문에 나는 후자에 기대고있다. 작동하지 않는 포트는 특별히 방화벽을 해제해야합니까? –

+0

@Brett Powell : 그렇습니다. 스크립트가 미친 듯이 -----.torservers.com이 게임 서버에 연결하는 것을 막는 (다소간) 특정 규칙이있는 것 같습니다. 웹 서버 주소와 포트 (예 : ip = www.heise.de & port = 80)를 입력하면 올바르게 작동합니다. 어쩌면 일부 표준 포트 (http, ftp, ssh, ...)는 방화벽이나 1024 이하의 포트에서만 허용됩니다. – VolkerK

+0

괜찮아요, 고마워요! –

3

위에 인용 된 세 개의 호스트가 모두 동일한 컴퓨터에 있습니까? 아니면 별도의 컴퓨터에 있습니까? 그들 사이의 구성이 일관성이 없을 수 있습니다. '는 fsockopen'가 활성화되어 있는지 확인하십시오 :

<?php 
if(function_exists('fsockopen')) { 
     echo "fsockopen function is enabled"; 
} 
else { 
     echo "fsockopen is not enabled"; 
} 
?> 

그것을 사용하는 경우, 방화벽 규칙이 성공하지 호스트를 차단하고 있는지 확인합니다.

오류가 발생하면 스크립트를 cURL 기반 구현으로 마이그레이션하십시오 (http://ch.php.net/curl). 그러면 문제를 해결하는 데 도움이되는지 확인하십시오.

+0

우수합니다. 감사합니다. libcurl 접근 방식에 대해이 작업이 필요하지 않습니까? http://pastie.org/2829896 게임 서버 포트를 사용하여 여전히 오프라인으로 보여줍니다. 따라서 방화벽이 비활성화되어 있다고 생각 하긴하지만 컴퓨터를 확인해 볼 것입니다. –