1

C とのネットワーキングに関する多くの例を読みましたが、行き詰まっています。SYN フラグ付きの TCP パケットが (wireshark を使用して) ネットワーク上にあることがわかりますが、受信側 (テスト目的で仮想マシンをセットアップしました) は RST も含めて何も返信しません。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <strings.h>


int establish_tcp(int port) {
    char *ip = "10.0.2.15"; /* Virtual Machine */
    struct sockaddr_in sockaddrin;
    struct hostent *host;
    int sock;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock == -1) {
        fprintf(stderr, "Socket Error\n");
        exit(1);
    }

    sockaddrin.sin_family = AF_INET;

    host = gethostbyname(ip);
    if(host == NULL) {
        fprintf(stderr, "%s unknown host.\n", ip);
        exit(2);
    }

    /* copies the internet address into the struct */
    bcopy(host->h_addr, &sockaddrin.sin_addr, host->h_length);

    /* specify port (used by TCP a layer above */
    sockaddrin.sin_port = port;

    /* try to connect */
    return connect(sock, (struct sockaddr*) &sockaddrin, sizeof(struct sockaddr_in));
}

int main(void) {
    printf("status: %i\n", establish_tcp(80));
    return 0;
}

パケットがタイムアウトするまでしばらく時間がかかり、ステータス コードとして -1 が返されます。ターゲット マシンが応答を送信しないのはどうしてですか? 私は何を見落としましたか?


セットアップの問題ではないことがわかったと思います。Ubuntu 12.04 を実行しています。仮想マシンは Debian Wheezy です。その IP を で確認しますifconfig。でマシンに到達できるかどうか試しましたtelnet
Virtual Box に関連する可能性のある問題を回避するために、IP を Google の IP に置き換えてみましたが、同じ結果が得られました。

4

1 に答える 1

4

問題はおそらくこれです:

sockaddrin.sin_port = port;

ポート番号はネットワーク バイト オーダーにする必要があります。これは、x86 および x86_64 マシンのネイティブ バイト オーダーとは異なります。

への変更:

sockaddrin.sin_port = htons(port);
于 2012-11-22T15:19:34.440 に答える