-1

ポート番号を追加すると、クライアントがこのポートのすべてのサービスを検索するので、簡単なクライアントプログラムを実行する必要があります。ifステートメントのセグメンテーション違反に問題があります。すべてのサービスを返却するにはどうすればよいですか?私のプログラムでは、1つだけ返されると思います。

私のコード:

   int main (int argc, char *argv[])
{
    int sockfd, n,pol, s;
    int numer;
    char recvline[MAXLINE +1];
    char  p;
    struct sockaddr_in servaddr;
    struct servent *sp;

    if (argc != 3)
        err_sys("Aby uruchomić podaj: klient <Adres IP> <port>");

    s = atoi(argv[2]);
    if((sp = getservbyport(s,NULL)) == NULL)
        {
            printf("port (s): %d \n", s);
            printf("port (sp): %d \n", sp->s_port); //segmentation fault
            err_sys("problem with port");   
        }

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
        err_sys("Blad utworzenia polaczenia");
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = sp->s_port;
    if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0)
        err_sys_kom("Blad konwersji do adresu IP dla %s", argv[1]);

    printf("%s", sp->s_name);
    pol = connect(sockfd, (SA*) &servaddr, sizeof(servaddr));
    if (pol < 0)
       {
          err_sys_kom("Blad polaczenie z serwerem");
          close(sockfd);
          exit(-1);
       }
    else
        str_cli(stdin, sockfd , 1);

exit(0);
}
4

1 に答える 1

2

編集(新しい新しい問題への対応-以下のコメントを参照):

おそらく、プロトコルのリストを取得して、ループ内でそれらを操作する必要があります。ループの内容は大まかに次のようになります。

  1. 電話getprotoent
  2. 結果がNULLの場合は、ループを終了します。
  3. それ以外の場合は、返された構造からプロトコル名を掘り下げます。
  4. その名前をの2番目の引数として使用しますgetservbyport
  5. 結果でやりたいことをする

編集(新しい問題に対応して):

if((sp = getservbyport(s,NULL)) == NULL)

したがって、ロジックは、の場合にspのみ読み取ることspですNULL。明らかに、セグメンテーション違反になります。

そのはず:

if((sp = getservbyport(s,NULL)) != NULL)

しかし、その後、別の新しい問題を指摘します:

なぜspNULLなのですか?

これは、(私の回答の以前のバージョンのように)整数ではないatoi何かに対してを行ったことが原因である可能性があります。他の理由が考えられます。あなたがどのような入力をしたのかわからないので、私たちは言うことができません。


回答のこの次の部分は、OPが同じ質問で尋ねた古い問題への応答であり、それ以降、それを編集することを選択しました。

まず第一に:あなたはを使用しているので、まだ読んでいないのであればgetservbyport、あなたは本当にサービスについて読むべきです。

次にエラーに移ります。

getservbyportタイプは:

struct servent *getservbyport(int port, const char *proto);

forではなくargv[2]タイプのパスを渡します。char *intport

ユーザーがこれをプログラムの引数として入力すると思いますか?

ポイントが「1024」のような整数のように見える文字のセットを指していることがわかっている場合は、それを。を使用して整数に変換できます。char *atoi

代わりに、エラーのある行で、を呼び出すときに、これを実行します。ただし、次のgetservbyportものが含まれていることを確認してくださいstdlib.h

getservbyport(atoi(argv[2]),NULL)

が整数として表現できない場合argv[2]は、未定義の動作が発生するため、最初にこれを確認することをお勧めします。

于 2012-06-06T09:36:50.700 に答える