1

現在getservbyname()、Linux Mint の関数で問題が発生しています。返されるポートを取得しようとするたびに、NULL何が原因かわかりません。

   extern struct servent *get_port(char *name, char *prot) {
      struct servent *tmp;
      tmp = getservbyname(name, prot);
      if(tmp == NULL) {
        return NULL;
      }
      return tmp;
    }

これは私が関数を呼び出す方法です

    struct servent *port;

    if((port = (struct servent*)get_port("server", "tcp")) == NULL){
        perror("Error... \n");
        return -1;
    }
    printf("Got the port... \n");

問題に関する詳細情報を取得するために perror 関数を使用しましたが、コードを実行するたびに、関数が正しく機能していることがわかります...

4

2 に答える 2

2

getservbyname()設定されていないerrnoため、perror()機能しません。

返されるNULL場合、最も可能性の高い理由は、指定したサービスがサービス ファイルに存在しないか、サービス ファイルを開くことができないことです。

あなたの例の名前は"server"、サービス データベースに一般的に含まれる名前ではありません - のようなサービスを検索しようとしています"ftp"

于 2013-01-25T06:02:41.777 に答える
0

getservbynameマニュアルページから:

getservbyname() 関数は、プロトコル proto を使用して、サービスと一致するデータベースからのエントリのサーバー構造を返します 。protoが NULL の場合、すべてのプロトコルが一致します。

/etc/servicesファイルの構造は次のとおりです。

echo        7/tcp
echo        7/udp
ftp         21/tcp
smtp        25/tcp     

tcpおよびudpプロトコル ( echo ) で利用できるサービスと、いずれかのプロトコル ( ftpsmtp )でしか利用できないサービスがあります。このgetservbyname関数は、サービス名を検索するファイルをクエリし、名前ポート番号プロトコルエイリアス/etc/servicesなどの情報を含む構造体を返します。

他の人がすでに指摘しているように、コードの問題は、関数のnameパラメータがサーバー名 ( localhostなど) ではなく、探しているサービス名 ( ftpなど) であることです。protoパラメータはオプションです。値が NULL の場合、任意のプロトコルに一致します。有効なプロトコルはtcpまたはudpです。これらのいずれかに特に関心がある場合に備えてください。

于 2014-11-26T21:53:56.073 に答える