작성자: Armel Fauveau
원본 주소: http://www.phpbuilder.net/columns/armel20010427.php3
PHP는 원격 또는 로컬 서버의 소켓을 열 수 있습니다! 다음은 소켓을 사용하는 간단한 예입니다. 유즈넷 뉴스 서버에 연결하고, 서버와 통신하고, 정확한 뉴스 그룹에서 일부 기사를 다운로드합니다.
PHP를 사용하여 소켓 열기
fsockopen()을 사용하여 소켓을 엽니다. 이 함수는 PHP3과 PHP4 모두에 존재합니다. 함수의 프로토타입은 다음과 같습니다:
intfsockopen
(string 호스트 이름,
int port [,
int errno [,
string errstr [, string
double timeout] ]])
?>
네트워크 호스트의 경우 호스트 이름의 포트에 TCP 소켓 연결을 설정합니다. 호스트 이름은 도메인 이름이거나 IP 주소일 수 있습니다. UDP 연결의 경우 udp://hostname 프로토콜을 지정해야 합니다. Unix 호스트의 경우 호스트 이름은 소켓 경로에 사용되며 이 예에서는 포트를 0으로 설정해야 합니다. 선택적 시간 초과를 사용하여 연결 시간 초과에 대한 시간(초)을 설정할 수 있습니다.
fsockopen()에 대한 자세한 내용은 http://www.php.net/manual/function.fsockopen.php에서 확인할 수 있습니다.
NNTP(Network News Transfer Protocol)
유즈넷 뉴스 서버에 액세스하는 데 필요합니다. 네트워크 뉴스 전송 프로토콜 표준인 NNTP라는 특수 프로토콜에 적용됩니다. 이 프로토콜의 세부사항은 RFC977에 있으며 http://www.w3.org/Protocols/rfc977/rfc977.html에서 볼 수 있습니다. 이 문서에서는 다양한 명령을 사용하여 NNTP 서버에 연결하고 통신하는 방법을 자세히 설명합니다.
서버에 연결
NNTP 서버에 연결하려면 서버의 호스트 이름(또는 IP 주소)과 서버가 수신 대기할 포트를 알아야 합니다. 또한 연결이 실패할 때 프로그램이 "정지"되지 않도록 시간 제한을 추가하는 것이 좋습니다.
$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 "Connexionfailedn"
exit()
else {
echo "Connectedn";
$tmp = fgets($usenet_handle, 1024);
}
?>
서버와 상호작용
이제 서버에 연결되었으며 다음을 통해 열 수 있습니다. 서버와 상호 작용하기 위한 이전 소켓 연결입니다. 서버에 "특정 뉴스 그룹의 최신 10개 기사를 가져오고 싶습니다"라고 가정해 보겠습니다. RFC977은 올바른 뉴스 그룹을 선택하는 방법에 대한 명령을 다음과 같이 정의합니다.
GROUPggg
필수 매개변수 ggg는 net.news와 같이 선택하려는 뉴스 그룹의 이름입니다. list 명령을 사용하면 유효한 뉴스 목록을 얻을 수 있습니다. 성공적인 선택 응답은 그룹의 첫 번째 및 마지막 두 뉴스 기사의 뉴스 번호와 보관된 뉴스 번호의 추정치를 반환합니다.
예를 들어
chrome:~$ telnetmy.news.host 119
aa.bb.cc.dd를 시도 중입니다...
my.news.host에 연결되었습니다.
이스케이프 문자는'^입니다. ] '.
200 my.news.hostInterNetNews NNRP 서버 INN 2.2.2 1999년 12월 13일 준비(게시 가능)
GROUP alt.test
211 232 222996 223235alt.test
종료
205.
"GROUP alt.test" 명령을 받은 후 뉴스 서버가 "211232 222996 223235 alt.test"를 반환했습니다.211은 RFC 식별 코드입니다(명령이 성공적으로 실행되었다는 간단한 설명 - 자세한 내용은 RFC를 확인하세요). 반환된 정보는 232개의 기사가 있음을 나타냅니다. 그 중 가장 오래된 뉴스의 색인 번호는 222996이고, 최신 뉴스 색인 번호는 223235입니다. 이제 계산해 봅시다: 222996 232는 232235와 같지 않습니다. 누락된 기사는 서버에서 제거되거나 작성자에 의해 취소되거나(예, 가능하고 쉽습니다) 삭제되었습니다.
주의사항으로, 뉴스 그룹을 선택하기 전에 서버에서 인증을 요구할 수 있습니다. 물론 이는 서버가 공개인지 비공개인지에 따라 다릅니다. 일반적으로 누구나 뉴스를 얻을 수 있지만 뉴스를 게시하려면 인증이 필요합니다.
//$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 != "281Okrn ") {
echo "502인증 오류n";
종료();
}
// 뉴스그룹 선택
fputs($usenet_handle, "GROUP ".$cfgNewsGroup. " n ");
$tmp = fgets($usenet_handle, 1024);
if($tmp == "명령rn에 480 인증 필요") {
echo "$tmpn";
exit( ) ;
}
$info = Split(" ", $tmp);
$first = $info[2]
$last = $info[3]
인쇄 " : $firstn";
print "Last : $lastn";
?>
기사 가져오기
이제 최신 기사의 A 색인 번호가 있으므로 쉽게 얻을 수 있습니다. 최신 기사 10개. RFC977에는 ARTICLE 명령을 문서 색인 번호 또는 메시지 ID와 함께 사용할 수 있다고 명시되어 있습니다. 주의사항으로 여기서는 기사의 인덱스 번호와 메시지 ID가 다릅니다. 각 뉴스 서버가 다르게 정의되므로 동일한 기사의 인덱스 번호는 뉴스 서버마다 다르지만 메시지 ID는 동일해야 합니다. 고유(기사 헤더에 포함)
$cfgLimit = 10
// 마지막 기사 업로드
$boucle=$last-$cfgLimit
($ boucle <= $last) {
set_time_limit(0)
fputs($usenet_handle, "ARTICLE$bouclen")
$article=""
$tmp = fgets( $usenet_handle , 4096);
if(substr($tmp,0,3) != "220") {
echo " ------------------ -------- -- n";
echo "$bouclen 기사에 대한 오류";
echo " -------- -- n";
}
else {
while($tmp!=".rn") {
$tmp = fgets($usenet_handle, 4096);
$article = $ Article.$tmp;
}
echo " ---------------------- n"
echo "Article$bouclen"
echo " ----- ------------------ n";
echo "$articlen"
} }
$boucle ;
}
?>
이 서버에서는 이 그룹의 최신 뉴스 10개만 가져왔습니다. HEAD 명령을 사용하여 기사의 헤더 정보를 가져오거나 BODY 명령을 사용하여 뉴스 본문을 가져올 수도 있습니다.
연결 닫기
fclose() 함수를 사용하여 NNTP 서버와의 세션을 종료합니다. 물론 다음과 같이 새 파일을 만들 수도 있습니다.
// close connexion
fclose($usenet_handle);
?>
fclose()에 대한 자세한 내용은 http://www.php.net/manual/function.fclose.php를 참조하세요.
결론
이 기사에서는 특정 상황에서 소켓 연결을 열고 사용하고 닫는 방법(NNTP 서버에 연결하고 뉴스 그룹에서 일부 기사를 검색하는 방법)만 설명했습니다. POST 명령을 사용하여 NNTP 서버에 기사를 게시하는 것은 그다지 복잡하지 않습니다.
따라서 다음 단계는 기사를 쉽게 저장하고 일부 검색 엔진(예: htgid, http://www.htdig.org/)을 사용할 수 있는 뉴스 클라이언트를 작성하고 일부 Netscape를 제거하는 것입니다. 뉴스 그룹에서 키워드 검색을 수행할 수 있는 웹 애플리케이션이 있어야 합니다. 다음은 예입니다. http://www.phpindex.com/ng/를 방문하여 다운로드할 수 있습니다.
위 내용은 Steelray 프로젝트 뷰어의 내용을 포함하여 PHP에서 소켓을 사용하여 유즈넷에서 파일을 얻는 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.