현재 위치: > 최신 기사 목록> GetservbyName과 GetProtobyname을 쿼리 프로토콜 및 포트로 결합하는 방법

GetservbyName과 GetProtobyname을 쿼리 프로토콜 및 포트로 결합하는 방법

gitbox 2025-05-31

기능 소개

getservbyname ()

GetServbyName (String $ Service, String $ Protocol) : int | false

이 기능은 서비스 이름과 프로토콜 이름을 통해 해당 포트 번호를 쿼리하는 데 사용됩니다. 예를 들어, HTTP 서비스는 일반적으로 TCP 프로토콜을 사용하고 포트 80을 듣습니다.

 $port = getservbyname('http', 'tcp');
echo $port; // 산출: 80

getProtobyname ()

getProtoByname (String $ name) : int | false

이 기능은 프로토콜 이름 (예 : "TCP", "UDP")에 따라 프로토콜 번호를 얻는 데 사용됩니다. 예를 들어:

 $proto = getprotobyname('tcp');
echo $proto; // 산출: 6

결합 된 사용 시나리오

특정 네트워크 서비스에 연결해야 할 때는 종종 서비스의 포트 번호뿐만 아니라 사용 된 프로토콜 번호도 알아야합니다. 예를 들어, socket_create ()socket_connect ()를 사용하여 연결을 설정할 때는 프로토콜 번호를 매개 변수 중 하나로 제공해야합니다.

두 기능을 함께 사용하면 다음과 같이 작동 할 수 있습니다.

 $service = 'http';
$protocol = 'tcp';

$port = getservbyname($service, $protocol);
$proto = getprotobyname($protocol);

if ($port === false || $proto === false) {
    die("서비스 또는 계약을 해결할 수 없습니다\n");
}

echo "제공하다 '{$service}' 포트를 사용하십시오: {$port}\n";
echo "규약 '{$protocol}' 숫자는입니다: {$proto}\n";

실제 적용 예 : TCP 소켓 생성

다음은이 두 기능을 사용하여 TCP 연결을 만드는 간단한 예입니다.

 $service = 'http';
$protocol = 'tcp';
$host = 'gitbox.net';

$port = getservbyname($service, $protocol);
$proto = getprotobyname($protocol);

if ($port === false || $proto === false) {
    die("제공하다或규약无法识别\n");
}

$socket = socket_create(AF_INET, SOCK_STREAM, $proto);
if ($socket === false) {
    die("만들 수 없습니다 socket: " . socket_strerror(socket_last_error()) . "\n");
}

$result = socket_connect($socket, $host, $port);
if ($result === false) {
    die("연결할 수 없습니다 {$host}:{$port} - " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "성공적으로 연결되었습니다 {$host}:{$port},使用규약编号 {$proto}\n";
socket_close($socket);

이 예에서는 GetServbyName ()을 사용하여 HTTP 대응 포트 80, getProtobyname ()을 가져 와서 TCP 프로토콜 번호 6을 얻은 다음 TCP 소켓을 Gitbox.net 의 포트 80에 생성 및 연결합니다.


주목해야 할 것

  1. 이 두 기능은 /etc /service/etc /protocol 과 같은 시스템의 서비스 및 프로토콜 정의 파일에 의존하여 정의가 불완전한 경우 구문 분석 실패를 유발할 수 있습니다.

  2. 이러한 기능을 사용한 결과 런타임 오류를 피하기 위해 항상 잘못 판단해야합니다.

  3. 이러한 기능은 C 언어로 GetServbyName 및 GetProtobyname에 대한 간단한 캡슐화이며 기본 소켓 프로그래밍에 익숙한 사용자에게 매우 친절합니다.