>백엔드 개발 >PHP 튜토리얼 >PHP에서 소켓 사용: 뉴스그룹에서 기사 가져오기

PHP에서 소켓 사용: 뉴스그룹에서 기사 가져오기

高洛峰
高洛峰원래의
2016-12-01 15:10:201107검색

PHP는 원격 또는 로컬 호스트에서 소켓 포트를 열 수 있습니다. 이 기사는 소켓을 사용하는 간단한 예입니다. 유즈넷 뉴스 그룹 서버에 연결하고, 서버와 통신하고, 뉴스 그룹에서 일부 기사를 다운로드합니다.


PHP에서 소켓 열기
fsockopen()을 사용하여 소켓을 엽니다. 이 함수는 php3와 php4 모두에서 사용할 수 있습니다. 함수 선언은 다음과 같습니다.


int fsockopen (string 호스트 이름, int port _
[, int errno [, string errstr [, double timeout]]])


이 함수는 호스트 이름의 포트에 대한 TCP 연결을 엽니다. 호스트 이름은 유효한 도메인 이름이거나 IP 주소일 수 있습니다. UDP 연결의 경우 udp://hostname 프로토콜을 지정해야 합니다. Unix 도메인의 경우 호스트 이름은 소켓 경로를 사용합니다. 선택적 timeout 매개변수는 소켓 열기를 기다리는 시간(초)을 설정하는 데 사용됩니다.


Network News Transfer Protocol
뉴스 그룹 서버에 액세스하려면 NNTP(Network News Transfer Protocol)라는 프로토콜이 필요합니다. 이 문서에서는 NNTP 서버에 연결하는 방법, 서버와 통신하는 방법, 이러한 작업을 수행하기 위한 다양한 명령에 대해 설명합니다.


연결
NNTP 서버에 연결하려면 호스트 이름(또는 IP 주소)과 수신 대기 중인 포트를 알아야 합니다. 연결 시도 실패로 인해 프로그램이 중단되는 것을 방지하려면 timeout 매개변수를 사용해야 합니다.
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10;

//소켓 열기
if(!$cfgTimeOut)
// 시간 제한 없음
$usenet_handle = fsockopen($cfgServer, $cfgPort)
else
$usenet _handle = fsockopen($cfgServer , $cfgPort, &$ errno, &$errstr, $cfgTimeOut);

if(!$usenet_handle) {

echo "연결 실패.n"
exit()
}
else {
echo "Connected.n"; $tmp = fgets($usenet_handle, 1024)
}

?>

서버와 대화


이제 서버에 연결되었으므로 앞서 열린 소켓을 통해 서버와 통신할 수 있습니다. 예를 들어, 특정 뉴스 그룹에서 최근 10개의 기사를 가져오고 싶다고 가정해 보겠습니다. RFC977은 첫 번째 단계가 GROUP 명령을 사용하여 올바른 뉴스 그룹을 선택하는 것이라고 지적합니다.
GROUP ggg
매개변수 ggg는 선택할 뉴스 그룹의 이름입니다(예: "net.news" )이 필요합니다. 사용 가능한 뉴스그룹 목록은 LIST 명령을 사용하여 얻을 수 있습니다. 뉴스 그룹을 선택하는 명령이 성공하면 그룹의 첫 번째 기사와 마지막 기사의 기사 번호뿐만 아니라 그룹의 기사 수도 반환됩니다.


예:

chrome:~$ telnet my.news.host 119

aa.bb.cc.dd 시도 중...
my.news에 연결됨 .host.
이스케이프 문자는 '^]'입니다.
200 my.news.host InterNetNews NNRP 서버 INN 2.2.2 13-Dec-1999 준비(게시 가능) > 211 232 222996 223235 alt.test
종료
205 .

GROUP alt.test 명령을 받은 후 서버는 "211 232 222996 223235 alt.test"를 반환합니다. 211은 명령이 실행되었음을 나타내는 반환 코드에 정의되어 있습니다. 성공적으로. 반품 정보에는 현재 232개의 기사가 있고 가장 이른 기사 번호는 222996이며 최신 기사 번호는 223235라고 나와 있습니다. 222996+232는 223235와 같지 않다는 것을 알 수 있습니다. 누락된 7개의 기사는 합법적인 작성자에 의해 취소되었거나(가능하고 쉬운 일임) 스팸 기사이기 때문에 어떤 이유로 서버에서 삭제되었습니다.

한 가지 주의할 점은 일부 서버는 공개 서버인지 비공개 서버인지에 따라 뉴스 그룹을 선택하기 전에 인증이 필요할 수 있다는 것입니다. 서버에서 누구나 기사를 읽을 수 있도록 허용하지만 기사를 게시하려면 인증이 필요할 수도 있습니다.

           
      //$cfgUser    = "xxxxxx"; 
      //$cfgPasswd  = "yyyyyy"; 
      $cfgNewsGroup = "alt.php";

      //개인 서버에서 식별 필요 
      if($cfgUser) { 
          fputs($usenet_handle, "AUTHINFO USER ".$cfgUser. "N"); 
          $tmp = fgets($usenet_handle, 1024); 
          fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n"); 
          $tmp = fgets($usenet_handle, 1024);

          //오류 확인 
  
          if($tmp != "281 Okrn") { 
             echo "502 인증오류 "; 
              종료(); 
         } 
  } 
   
  //뉴스그룹 선택 
    
  fput($usenet_handle, "GROUP ".$cfgNewsGroup."n"); 
  $tmp = fgets($usenet_handle, 1024); 
   
  if($tmp == "명령에 480 인증 필요") { 
     echo $tmp; 
     종료(); 
  } 
   
  $info = Split(" ", $tmp); 
  $first= $info[2]; 
  $last = $info[3]; 
   
  printf("첫 번째 : %sn", $first); 
  printf("마지막 : %lastn", $last);

?>

 


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.