1

iOS のソケットを介して ICMP パケットを送信しています。

struct sockaddr         hostAddress;

self->hostAddress.sa_family = AF_INET;
inet_pton(AF_INET, "173.194.67.93", &self->hostAddress.sa_data);

次に、ソケットを開き、パケットを送信します。

bytesSent = sendto(
                   CFSocketGetNative(self->_socket),
                   [packet bytes],
                   [packet length],
                   0,
                   &self->hostAddress,
                   sizeof(self->hostAddress)
                   );

WireShark でパケットを見ると、「173.194.67.93」ではなく「67.93.0.0」に送信されています。

どこに問題があるのでしょうか?

4

1 に答える 1

3
inet_pton(AF_INET, ...);

struct in_addr3 番目の引数としてa を取る必要があります ( docsを参照)。

あなたはそれを与えていますsa_data、から

struct sockaddr {
    unsigned short    sa_family;    // address family, AF_xxx
    char              sa_data[14];  // 14 bytes of protocol address
};

これは実際には次のように扱われます:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

そのため、最初の 16 ビットはポートに入り、IPV4 アドレスの 2 番目の 16 ビットは実際には にsin_addrなり、残りはゼロで初期化されているように見えます。


これを行う必要があります(わかりやすくするために、キャストをたくさん入れます)

struct sockaddr *addr = &self->hostAddress; // generic address
struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr; // downcast to ipv4
inet_pton(AF_INET, "173.194.67.93", &ipv4->sin_addr);
于 2012-10-22T15:42:27.433 に答える