0

特定のアドレスに接続する単純なクライアントを実装しようとしています。sockaddr_in 構造体に入力した後、指定されたアドレスと IP アドレスとポートを出力していることに気付くでしょう。同じはずなのに、2 つの異なるアドレスを取得します。

これが私のコードです:

int createConnection(char * address, char * port) {
    cout << address << " " << port << endl;
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(port));
    inet_aton(address,&(server.sin_addr));
    memset(&(server.sin_zero), '\0', 8);
    if ((sockFd = socket(PF_INET,SOCK_STREAM,0)) == -1) {
        perror("client: socket");
    }
    if (connect(sockFd,(const sockaddr *)&server,sizeof(struct sockaddr_in)) == -1) {
        close(sockFd);
        perror("client: connect");
    }

    char s[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, (struct sockaddr *)&server, s, sizeof s);
    printf("client: connecting to %s, %i\n", s, server.sin_port);
    printf("connected");
    return 0;
}

そして、出力は

132.65.151.39 3000
client: connecting to 2.0.11.184, 47115

私の質問:

  1. 2 つの異なるアドレスが表示されるのはなぜですか?
  2. 接続が失敗しないのはなぜですか?

私のプログラムは後で recv() でブロックされるので、必要な場所に接続されなかったと思います。ありがとう!

4

1 に答える 1

3

に間違ったものを渡しているようですinet_ntop():

inet_ntop(AF_INET, (struct sockaddr *)&server, s, sizeof s);

あなたはおそらく合格しているはずです.sin_addr

inet_ntop(AF_INET, &server.sin_addr, s, sizeof s);

ntohs()ポートの場合、ホストのバイト順に戻すために呼び出す必要があるため、間違って出力されます。

printf("client: connecting to %s, %i\n", s, ntohs(server.sin_port));

実際には、おそらくアドレス正しく設定されているため、接続は機能します。

于 2012-06-13T13:10:54.917 に答える