0

小さなコード ブロックの実行に問題があります。これは C でのソケット プログラミングに関するものです。私がやろうとしているのは、クライアントが 2 つの異なるポートでサーバーと通信するようにすることです。しかし、クライアント コードをコンパイルしようとすると、「セグメンテーション違反」が発生します。ここでクライアントコードを提供します。何が問題なのか教えてください。

    #include<stdio.h>
    #include<stdbool.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>

    int main(int argc,char *argv[])
    {
     int sockfd,newsockfd,sockfd_infinite,sockfd_kitchen,portno,portno1,n,no_of_tables;
     struct sockaddr_in serv_addr,kitchen_addr;
     struct hostent *server,*kitchen;
     struct timeval time_out;
     time_out.tv_sec = 15;    // 15 seconds
     time_out.tv_usec = 0;    // 0 milliseconds
    //       server=gethostbyname(argv[1]);
    //       char buffer[256];
     portno=atoi(argv[2]);
     portno1=atoi(argv[4]);
     sockfd=socket(AF_INET,SOCK_STREAM,0);
     if(sockfd==-1)
            error("\nError creating socket");
     server=gethostbyname(argv[1]);
     serv_addr.sin_family=AF_INET;
     serv_addr.sin_port=htons(portno);
     bcopy((char *)server->h_addr,
            (char *)&serv_addr.sin_addr.s_addr,
            server->h_length);

     sockfd_kitchen=socket(AF_INET,SOCK_STREAM,0);
     if(sockfd_kitchen==-1)
            error("\nError creating socket");
     kitchen=gethostbyname(argv[3]);
     kitchen_addr.sin_family=AF_INET;
     kitchen_addr.sin_port=htons(portno1);
     bcopy((char *)kitchen->h_addr,
            (char *)&kitchen_addr.sin_addr.s_addr,
            kitchen->h_length);

     n=connect(sockfd_kitchen,(struct sockaddr *)&kitchen_addr,sizeof(kitchen_addr));
     if(n==-1)
            error("\nError connecting to kitchen");
     n=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
     if(n==-1)
            error("\nError connecting to server");
     return 0;
    }

つまり、このコードの背後にある考え方は、クライアントとサーバーが存在するということです。このクライアントは、クライアントが 2 つの異なるサーバーと通信しているかのように、2 つの異なるポートでサーバーと通信したいと考えています。サーバー名と異なるポート番号の両方に「localhost」としてサーバー名を指定して、ラップトップでこれを行っています。私のコードでわかるように、2 つのサーバー、つまり *server と *kitchen に対して 2 つのポインター変数があります。

例: ./thiscode localhost 15535 localhost 12345

前述の例では、クライアント コードを次のようにコンパイルしています。argv[1] は最初の「localhost」(サーバー名) で、argv[2] は最初のサーバーのポート番号です。2 番目の「localhost」と「12345」は、2 番目のサーバーの名前とポート番号です。

前に言ったように、ラップトップで 3 つの異なるコード (クライアント用に 1 つ、サーバー用に 2 つ) を実行する 3 つのウィンドウを作成しようとしています。2 つのサーバー コードは問題なくコンパイルできますが、クライアント コードではこの「セグメンテーション」エラーが発生します。どこが間違っているのか教えてください。ありがとう。

4

2 に答える 2

0

まず、次の戻り値を確認する必要がありますgethostbyname

gethostbyname() および gethostbyaddr() 関数は、エラーが発生した場合、hostent 構造体または NULL ポインターを返します。エラーが発生した場合、h_errno 変数はエラー番号を保持します。

于 2012-09-28T03:00:56.850 に答える
0

問題はbcopy()関数呼び出しにあるようです。

変数にコピーする前に変数のスペースを宣言していないため、セグメンテーション違反が発生しました。

ステートメントの前に次のコードを入力してbcopy()、Seg-fault を削除します。

serv_addr.sin_addr.s_addr=malloc(sizeof(unsigned long));
于 2016-01-24T09:04:50.657 に答える