socket()
関数呼び出しを下記する(ソケットタイプ、プロトコルが異なっていてもよい)を使用するpacket socket
を作成するには、:パケットソケットの作成時にhtons()を使ってプロトコルを指定するのはなぜですか?
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
そしてstream socket
を作成するために、次の呼び出しが使用される:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
packet socket
を作成する際にプロトコルを指定するのにhtons()
を使用し、AF_INET or AF_INET6
ファミリのソケットを作成しない場合、私の質問はなぜですか?なぜpacket socket
またはその逆を作成する際に使用されるように、ストリームまたはデータグラムソケットを作成する
socket(AF_INET, SOCK_XXX, htons(IPPROTO_XXX))
を使用しません。 socket()関数への2つの呼び出しでプロトコルを使用すると、ソケットとTCPレベルの両方のソケットが作成されます。
イーサネット*と* IP *ヘッダーのオン・ザ・ワイヤ形式*は、ネットワークバイトオーダーと呼ばれます(2番目の段落で説明したように)。あなたは、あなたが "ワイヤー"にしたいと思う順序で置くことができます。 –
ETH_P_XXX値が「着信パケットとの比較」であることを考慮すると、なぜIPPROTO_XXX値がネットワークバイトオーダーに変換されないのか。 2番目のパラは、異なるプロトコルファミリがプロトコルをそれに合った形で解釈することを選択できるという上記の質問の理由を示していることを理解しています。これは関数の内部でプロトコルを変換することを選ぶことができたので、これは関数の開発者が決定したことを意味しますか? 3番目のパラグラフでは、プロトコル番号がintとして渡されるので、バイト順序が意味をなさない。私が間違っている場合は修正してください。 – rht
このように考える:リトルエンディアンマシンで2つの16ビット値を比較している場合。比較を行うには2通りの方法があります:(a)メモリに現れる順に1バイトずつ比較する、(b)16ビット単位をレジスタにロードして比較する。一方、1バイトの値では、これらの方法の両方が同じものになります。 –