3

以下を使用して raw パケット ソケットをセットアップします。

sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );

次に、次を使用してソケットオプションを設定しようとしていますIP_HDRINCL:

int one = 1;
if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
    LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n");

しかし、このオプションを設定できません ( errno92 のエラーと「プロトコルが利用できません」というメッセージが表示されます。変更PF_PACKETするとPF_INET、オプションが設定されますが、使用する必要がありますPF_PACKET。ソケットでこのオプションを設定する方法はありますか?上で作成?

本当にありがとう。

4

2 に答える 2

3

PF_PACKETソケットには、質問で設定するオプションがありません。PF_INETこのオプションは、 タイプが のまたはPF_INET6ソケットでのみ使用できますSOCK_RAW

カーネルによって IP ヘッダーを追加する場合は、PF_INETソケットを使用する必要があります。

于 2011-11-16T04:49:37.350 に答える
2

代わりに次のようにすることができます。

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

これは、ソケットが IP_HDRINCL が設定された raw ソケットであることを意味します。を使用getsockoptしてソケットの値を確認すると、IP_HDRINCL が既に設定されていることがわかります。

于 2013-12-01T01:25:29.550 に答える