other versions
other languages
other sections
IP(7) | Linux Programmer's Manual | IP(7) |
名前¶
ip - Linux IPv4 プロトコルの実装書式¶
#include <sys/socket.h>説明¶
Linux は RFC 791 と RFC 1122 で記述されている Internet Protocol, version 4 を実装している。 ip には RFC 1112 に準拠した level 2 マルチキャストの実装が含まれている。 またパケットフィルタ機能を含む IP ルーターも実装されている。 プログラミング・インターフェースは BSD ソケットと互換である。 ソケットに関するより詳細な情報は socket(7) を参照のこと。 IP ソケットは、 socket(2) 関数を socket(AF_INET, socket_type, protocol) のように呼び出すことで生成される。指定できるソケットタイプは 3 つあり、 tcp(7) ソケットをオープンする場合 SOCK_STREAM、 udp(7) ソケットをオープンする場合 SOCK_DGRAM、 IP プロトコルに直接アクセスする ために raw(7) ソケットをオープンする場合には SOCK_RAW である。 protocol は送受信される IP ヘッダに書かれる IP プロトコルである。 指定できる値は、 TCP ソケットには 0 か IPPROTO_TCP、 UDP ソケットには 0 か IPPROTO_UDP に限られる。 SOCK_RAW に対しては、 RFC 1700 で定義 されている有効な IANA IP プロトコルを、 割り当てられている番号で指定する ことができる。 あるプロセスで、やってくるパケットを受信したり 接続要求を受けたりしたい場合には、 そのプロセスはローカルなインターフェースアドレスに、 bind(2) を用いてソケットをバインドしなければならない。 あるローカルな「アドレスとポート」のペアに対してバインドできる IP ソケットは一つに限られる。 bind(2) の呼び出しで INADDR_ANY が指定されていた場合は、ソケットはローカルなインターフェースの すべてにバインドされる。 listen(2) または connect(2) がバインドされていないソケットでコールされると、 そのソケットは自動的にローカルなアドレスを INADDR_ANY にセットし、空いているポートをランダムに選んでバインドする。アドレスのフォーマット¶
IP ソケットアドレスは、 IP インターフェースアドレスと 16ビットのポート番号の組み合わせで定義される。 IP プロトコルそのものはポート番号を扱わない。 ポート番号は、 udp(7) や tcp(7) といった、上位のプロトコルで実装される。 raw ソケットでは、 sin_port が IP プロトコルにセットされる。struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ }; /* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ };
sin_familiy には常に AF_INET をセットする。これは必須である。 Linux 2.2 では、このセットを忘れると ほとんどのネットワーク関数は EINVAL を返すようになっている。 sin_port にはポート番号をネットワークバイトオーダーで指定する。 1024 未満のポート番号は 特権ポート (privileged ports) と呼ばれる ( 予約ポート (reserved ports) とも時々呼ばれる)。 特権プロセス ( CAP_NET_BIND_SERVICE ケーパビリティを持つプロセス) 以外のプロセスは、これらのポートには bind(2) できない。 IPv4 プロトコルそのものにはポートに関する概念がない。 ポートは、 tcp(7) や udp(7) といった、上位のプロトコルにおいて実装される。 sin_addr は IP ホストアドレスである。 struct in_addr の s_addr メンバには、ホストのインターフェースアドレスを ネットワークバイトオーダーで 指定する。 in_addr は、INADDR_* の一つ (例えば INADDR_ANY) を代入する、 ライブラリ関数 inet_aton(3), inet_addr(3), inet_makeaddr(3) を用いる、 あるいは名前解決機構 (name resolver) を直接用いる、のどれかで設定すべきである。 ( gethostbyname(3) を見よ)。
ソケットオプション¶
IP にはプロトコル固有のソケットオプションがいくつか存在し、 setsockopt(2) で設定が、 getsockopt(2) で取得ができる。 IP のソケットオプションレベルは IPPROTO_IP である。 ブール整数値のフラグでは、 0 は偽、それ以外は真を意味する。- IP_ADD_MEMBERSHIP (Linux 1.2 以降)
- マルチキャストグループに参加する。
引き数は ip_mreqn
構造体である。
struct ip_mreqn { struct in_addr imr_multiaddr; /* IP multicast group address */ struct in_addr imr_address; /* IP address of local interface */ int imr_ifindex; /* interface index */ };
- ip_mreqn 構造体は Linux 2.2 以降でのみ利用可能である。互換性のため、 古い ip_mreq 構造体 (Linux 1.2 以降で存在する) もまだサポートされている。 ip_mreqn との違いは、 imr_ifindex フィールドを含まないことだけである。 setsockopt(2) でのみ使える。
- IP_DROP_MEMBERSHIP (Linux 1.2 以降)
- マルチキャストグループから抜ける。引き数は IP_ADD_MEMBERSHIP と同様に ip_mreqn または ip_mreq 構造体である。
- IP_FREEBIND (Linux 2.4 以降)
- このブール値のオプションを有効にすると、ローカルではない IP アドレスや存在 しない IP アドレスをバインドできるようになる。これを使うと、対応するネット ワークインターフェイスがなかったり、アプリケーションがソケットをバインドしようと する時点で特定の動的 IP アドレスが有効になっていなかったりしても、ソケットを 接続待ち状態 (listening) にできるようになる。 このオプションは、下記に説明がある ip_nonlocal_bind /proc インターフェイス のソケット単位の設定である。
- IP_HDRINCL (Linux 2.0 以降)
- 有効になっていると、ユーザは IP ヘッダをユーザーデータの前に与える。 SOCK_RAW ソケットでのみ有効である。詳細は raw(7) を見よ。このフラグが有効になっていると、 IP_OPTIONS, IP_TTL, IP_TOS は無視される。
- IP_MTU (Linux 2.2 以降)
- ソケットの、既知の path MTU を取得する。 ソケットが接続している場合のみ有効である。 getsockopt(2) でのみ使える。
- IP_MTU_DISCOVER (Linux 2.2 以降)
- ソケットの Path MTU Discovery
の設定をセット・取得する。
有効になっていると、Linux
は SOCK_STREAM
ソケットに対して
RFC 1191
で定義されている Path MTU
Discovery を行う。 SOCK_STREAM
でないソケットについては、
IP_PMTUDISC_DO
をセットすると、
全ての送信パケットでフラグメント不許可フラグ
(don't-fragment flag) が必ず
セットされるようになる。
SOCK_STREAM
でないソケットでは、
パケットを MTU
のサイズの塊に分割したり、必要に応じて再送したりするのは、
ユーザが責任を持って行う必要がある。
既知の Path MTU
よりも大きなデータグラムの送信が要求されると、
カーネルは ( EMSGSIZE で)
送信を拒否する。
IP_PMTUDISC_WANT の場合は、 Path MTU
に基づいて必要であればデータグラム
の分割が行われ、それ以外の場合はフラグメント不許可フラグがセットされる。
Path MTU discovery 値 意味 IP_PMTUDISC_WANT ルートごとの設定を用いる。 IP_PMTUDISC_DONT Path MTU Discovery を行わない。 IP_PMTUDISC_DO 常に Path MTU Discovery を行う。 IP_PMTUDISC_PROBE DFビットをセットするが、Path MTU を無視する。
- IP_MULTICAST_IF (Linux 1.2 以降)
- ローカルデバイスをマルチキャストソケットとして設定する。引き数は IP_ADD_MEMBERSHIP と同様に ip_mreqn または ip_mreq 構造体である。
- 不正なソケットオプションが渡されると、 ENOPROTOOPT が返される。
- IP_MULTICAST_LOOP (Linux 1.2 以降)
- マルチキャストパケットをローカルなソケットにループバックするかどうかを 定めるブール値の整数引き数を設定・取得する。
- IP_MULTICAST_TTL (Linux 1.2 以降)
- このソケットから発信されるマルチキャストパケットの time-to-live 値を設定・取得する。 マルチキャストパケットに対しては、できるだけ小さな TTL に設定することがとても重要である。デフォルトは 1 で、 ユーザープログラムが明示的に要求しない限り マルチキャストパケットはローカルなネットワークから出ないことになる。 引き数に整数を取る。
- IP_NODEFRAG (Linux 2.6.36 以降)
- 有効 (引き数が 0 以外の場合) になっていると、netfilter 層での出力パケットの 再構築 (reassembly) が行われなくなる。このオプションは SOCK_RAW ソケット においてのみ有効である。引き数は整数である。
- IP_OPTIONS (Linux 2.0 以降)
- このソケットから送られるパケット全てに付随する IP オプションを 設定・取得する。オプションを保存しているメモリバッファへのポインタと オプションの長さとを引き数に取る。 setsockopt(2) を呼び出すと、ソケットに関連づけられる IP オプションを設定できる。 IPv4 におけるオプションのサイズの最大値は 40 バイトである。 用いることのできるオプションについては RFC 791 を見よ。 SOCK_STREAM ソケットに対する初期接続要求パケットに IP オプションが含まれていると、 ルーティングヘッダを付けて戻されてくる初期パケットの IP オプションに同じオプションがセットされる。接続が確立された後、 やってきたパケットのオプションを変更することはできない。 デフォルトでは。外部から受信したパケットの全ての source routing オプション の処理は無効となっており、 /proc インタフェースの accept_source_route を使うとこれを有効にできる。これを無効にしていても timestamps など の他のオプションの処理は行われる。データグラムソケットでは、 IP オプションはローカルユーザーしか設定できない。 getsockopt(2) を IP_OPTIONS をつけて呼ぶと、現在送信に用いられている IP オプションを 引き数に与えたバッファに取得できる。
- IP_PKTINFO (Linux 2.2 以降)
- IP_PKTINFO 補助メッセージを渡す。これには到着パケットに関する情報を提供する pktinfo 構造体が含まれている。 データグラム指向のソケットでしか動作しない。 引き数は IP_PKTINFO メッセージを通過させるかどうかをソケットに知らせるフラグである。 メッセージ自身は recvmsg(2) または sendmsg(2) を用いたパケットの制御メッセージとしてのみ送受信できる。
-
struct in_pktinfo { unsigned int ipi_ifindex; /* Interface index */ struct in_addr ipi_spec_dst; /* Local address */ struct in_addr ipi_addr; /* Header Destination address */ };
- ipi_ifindex はパケットが受信されたインターフェースの、他と重ならないインデックスである。 ipi_spec_dst はパケットのローカルアドレスである。 ipi_addr はパケットヘッダにある宛先アドレスである。 IP_PKTINFO が sendmsg(2) に渡されて、かつ ipi_spec_dst が 0 以外の場合、 ipi_spec_dst はルーティングテーブルを検索する際にローカルな送信元アドレスとして使用され、 IP source route オプションを設定するのにも使用される。 ipi_ifindex が 0 以外の場合、このインデックスによって指定されるインターフェースの プライマリローカルアドレスで ipi_spec_dst を上書きし、ルーティングテーブルを検索する。
- IP_RECVERR (Linux 2.2 以降)
- エラーメッセージの受け渡しに、信頼性の高い拡張された方法を有効にする。 データグラムソケットに対して有効になっていると、 発生したエラーは全てソケットごとのエラーキューに保存される。 ユーザーはソケット操作からエラーを受け取ったとき、 recvmsg(2) を MSG_ERRQUEUE フラグとともに呼べばそのエラーを取得できる。 そのエラーを記述する sock_extended_err 構造体が、タイプ IP_RECVERR・ レベル IPPROTO_IP の補助メッセージとして渡される。 これは接続志向でないソケットで信頼性の高いエラー処理を行いたい場合に 有用である。エラーキューの受信データフラグメントには エラーパケットが含まれる。
- IP_RECVERR 制御メッセージには sock_extended_err 構造体が含まれる:
-
#define SO_EE_ORIGIN_NONE 0 #define SO_EE_ORIGIN_LOCAL 1 #define SO_EE_ORIGIN_ICMP 2 #define SO_EE_ORIGIN_ICMP6 3 struct sock_extended_err { uint32_t ee_errno; /* error number */ uint8_t ee_origin; /* where the error originated */ uint8_t ee_type; /* type */ uint8_t ee_code; /* code */ uint8_t ee_pad; uint32_t ee_info; /* additional information */ uint32_t ee_data; /* other data */ /* More data may follow */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
- ee_errno にはキューに入っているエラーの errno 番号が入る。 ee_origin にはエラーが発生した場所を示すコードが入る。 その他のフィールドはプロトコル依存である。 SO_EE_OFFENDER マクロは与えられた補助メッセージへのポインタから エラーの発生したネットワークオブジェクトのアドレスへのポインタを返す。 アドレスが不明な場合、 sockaddr 構造体の sa_family フィールドは AF_UNSPEC となり、その他のフィールド値は不定である。
- IP は以下のような sock_extended_err 構造体を用いる: ee_origin は、エラー が ICMP パケットとして受信された場合には SO_EE_ORIGIN_ICMP にセットされ、 ローカルで起こった場合には SO_EE_ORIGIN_LOCAL にセットされる。 不明な値は 無視される。 ee_type と ee_code は ICMP ヘッダの type フィールドと code フィールドの値にセットされる。 ee_info には EMSGSIZE エラーに対す る discover された MTU が入る。 メッセージにはエラーを引き起こしたノードの sockaddr_in 構造体も含まれる。 これには SO_EE_OFFENDER マクロを使ってア クセスできる。 ソースが不明の場合、 SO_EE_OFFENDER アドレスの sin_family フィールドは AF_UNSPEC となる。 エラーがネットワークで起きた 場合には、 ソケットで有効になっていたすべての IP オプション ( IP_OPTIONS, IP_TTL など) とエラーパケットに含まれていたすべての IP オプションとが、 制 御メッセージとして渡される。 エラーを起こしたパケットのペイロード (payload) は 普通のペイロードとして返される。 TCP にはエラーキューがないことに注意して ほしい。 MSG_ERRQUEUE は SOCK_STREAM ソケットに対しては使えない。 TCP では IP_RECVERR だけが有効だが、ソケット関数から返されるエラーは SO_ERROR だけになる。
- raw ソケットに対して IP_RECVERR を指定すると、受信したすべての ICMP エラーをアプリケーションに 渡すようになる。指定しないと、 接続済みのソケットに対するエラーだけを報告する。
- このオプションはブール値のフラグを設定・取得する。 IP_RECVERR はデフォルトではオフになっている。
- IP_RECVOPTS (Linux 2.2 以降)
- 到着した全ての IP オプションを IP_OPTION コントロールメッセージに入れてユーザーに渡す。 ルーティングヘッダとその他のオプションとは、 ローカルホストに対してはあらかじめ記入されている。 SOCK_STREAM ソケットではサポートされていない。
- IP_RECVORIGDSTADDR (Linux 2.6.29 以降)
- このブール値のオプションがセットされると、 recvmsg(2) で IP_ORIGDSTADDR 補助メッセージが有効になる。 カーネルはデータグラムを受信した元の宛先アドレスをこの補助メッセージで返す。 この補助メッセージには struct sockaddr_in が格納される。
- IP_RECVTOS (Linux 2.2 以降)
- 有効になっていると、 IP_TOS 補助メッセージが到着パケットとともに渡される。 これにはパケットヘッダの Service/Precedence フィールドのタイプを指定するバイトデータが含まれている。 ブール整数値のフラグをとる。
- IP_RECVTTL (Linux 2.2 以降)
- このフラグがセットされていると、 IP_TTL コントロールメッセージが受信パケットの time-to-live フィールドのバイトデータとともに渡される。 SOCK_STREAM ソケットではサポートされていない。
- IP_RETOPTS
- IP_RETOPTS (Linux 2.2 以降) IP_RECVOPTS と等価だが、未処理の生のオプションを、 この hop では記入されない timestamp レコードと route レコードとともに返す。
- IP_ROUTER_ALERT (Linux 2.2 以降)
- フォワードすべきパケットを IP Router Alert オプションをつけて このソケットに渡す。 raw ソケットに対してのみ有効である。これはたとえばユーザー空間の RSVP デーモンに対して便利である。タップされたパケットは カーネルによってはフォワードされないので、これらを再送するのは ユーザーの責任となる。ソケットのバインドは無視され、 このようなパケットはプロトコルによってのみフィルタリングされる。 整数値のフラグを取る。
- IP_TOS (Linux 1.0 以降)
- このソケットから送信されるすべての IP パケットに適用される Type-Of-Service (TOS) フィールドを設定・取得する。 これはネットワーク上でのパケットの優先度を決めるために用いられる。 TOS はバイトデータである。標準の TOS フラグがいくつか定義されている。 IPTOS_LOWDELAY はインタラクティブなトラフィックの遅延を最小にする。 IPTOS_THROUGHPUT はスループットを最大にする。 IPTOS_RELIABILITY は信頼性を最高にする。 IPTOS_MINCOST は転送速度が遅くてもかまわないとき、「データを詰め込む」のに用いられる。 これらのうち、 1 つまでだけを設定できる。 他のビットは無効で、クリアされる。 Linux はデフォルトでは IPTOS_LOWDELAY データグラムを最初に送信する。 しかし、正確な振る舞いはキュー処理の設定に依存する。 高い優先度にするにはスーパーユーザー権限 ( CAP_NET_ADMIN ケーパビリティ) が必要となるかもしれない。 優先度は ( SOL_SOCKET, SO_PRIORITY) ソケットオプションを用いれば、 プロトコルに依存しない形でも設定できる ( socket(7) を見よ)。
- IP_TRANSPARENT (Linux 2.6.24 以降)
- このブール値のオプションを有効にすると、 このソケットで透過プロキシ (transparent proxy) ができるようになる。 このソケットオプションを使うと、呼び出したアプリケーションは、 ローカルではない IP アドレスをバインドして、ローカルの端点として自分以外の アドレス (foreign address) を持つクライアントやサーバの両方として 動作できるようになる。 注意: この機能が動作するためには、自分以外のアドレス宛のパケットが 透過プロキシが動作するマシン (TProxy box) 経由で転送されるように、 ルーティングが設定される必要がある。 このソケットオプションを有効にするには、スーパーユーザ特権 ( CAP_NET_ADMIN ケーパビリティ) が必要である。
- iptables の TPROXY ターゲットで透過プロキシリダイレクション (TProxy redirection) を行うには、リダイレクトされるソケットに対して このオプションを設定する必要がある。
- IP_TTL (Linux 1.0 以降)
- time-to-live フィールドの値を設定または取得する。 この値はこのソケットから送信されるすべてのパケットに用いられる。
/proc インタフェース¶
IP プロトコルでは、いくつかのグローバルパラメータを設定するための /proc ファイル群が用意されている。 これらのパラメータには、 /proc/sys/net/ipv4/ ディレクトリ内のファイルの読み書きでアクセスできる。 Boolean と書かれたインタフェースは整数値をとり、 0 以外の値 ("true") は対応するオプションが有効、 0 値 ("false") は無効、であることを意味する。- ip_always_defrag (Boolean; Linux 2.2.13 以降)
- [2.2.13
で新規登場。以前のバージョンのカーネルでは、この機能は
コンパイル時に
CONFIG_IP_ALWAYS_DEFRAG
オプションによって制御されていた;
このファイルは 2.4.x
以降では存在しない]
- ip_autoconfig (Linux 2.2 以降 2.6.17 まで)
- まだ記述していない。
- ip_default_ttl (integer; default: 64; Linux 2.2 以降)
- 送出されるパケットの time-to-live 値のデフォルトをセットする。 これは IP_TTL オプションを用いれば、パケットごとに変えることもできる。
- ip_dynaddr (Boolean; default: disabled; Linux 2.0.31 以降)
- 動的ソケットアドレスと、インターフェースアドレスが変更された際の マスカレードエントリの再書き込みを有効にする。 ダイアルアップインターフェースで、 IP アドレスが変更される場合に便利である。
- ip_forward (Boolean; default: disabled; Linux 1.2 以降)
- IP forwarding を有効にするかどうかのブール値フラグ。 IP forwarding するかどうかはインターフェースごとにも設定できる。
- ip_local_port_range (Linux 2.2 以降)
- ソケットに割り当てられているデフォルトのローカルポートの範囲を定める 二つの整数を与える。割り当ては 1 番目の番号から始まり、 2 番目の番号で終わる。 これらはマスカレードで用いられているポートと重なってはならない (その場合も取り扱われるが)。 ファイアウォールのパケットフィルターが「利用中のローカルポート」 について何らかの仮定をしている場合には、 番号を勝手に決めてしまうと問題が起きるかもしれない。 1 番目の番号は少なくとも 1024 より大きくすべきである。 良く使われるポートとの衝突を避けたり、ファイアウォールの問題を 回避したければ、 4096 よりも大きくするほうが良いだろう。
- ip_no_pmtu_disc (Boolean; default: disabled; Linux 2.2 以降)
- 有効になっていると、デフォルトで TCP ソケットに対する Path MTU Discoverty を行わない。 Path MTU Discovery は、 正しく設定されていない (ICMP パケットを全てドロップする) ファイアウォールや、 (point-to-point リンクで双方の MTU が一致していない場合など) 正しく設定されていないインターフェースが経路上に存在すると失敗してしまう。 Path MTU Discovery をグローバルに無効にするよりは、 壊れているルータを直すほうが良い。 Path MTU Discovery を無効にするとネットワークのコストが 大きくなってしまうからである。
- ip_nonlocal_bind (Boolean; default: disabled; Linux 2.4 以降)
- セットされていれば、プロセスが自分以外の IP アドレスを bind(2) できるようになる。これはかなり便利だが、うまく動かないアプリケーションもある。
- ip6frag_time (integer; default: 30)
- IPv6 フラグメントをメモリに保持しておく時間 (秒単位)。
- ip6frag_secret_interval (integer; default: 600)
- IPv6 フラグメントの hash secret の生成間隔 (hash secret の寿命) (秒単位)。
- ipfrag_high_thresh (integer), ipfrag_low_thresh (integer)
- キューイングされている IP フラグメントの量が ipfrag_high_thresh に達すると、キューの内容は ipfrag_low_thresh にまで切り捨てられる。それぞれの大きさを バイト単位で表す整数値が入っている。
- neigh/*
- arp(7) を見よ。
ioctl¶
socket(7) に記述されている ioctl は、すべて ip にも適用される。 ジェネリックデバイスのパラメータを設定する ioctl については netdevice(7) に記述されている。エラー¶
- EACCES
- 必要な権限のないユーザーが操作を実行しようとした。 以下のような場合が考えられる: SO_BROADCAST フラグを設定していない状態でブロードキャストアドレスに パケットを送ろうとした。 prohibit なルートを通してパケットを送ろうとした。 スーパーユーザー権限 ( CAP_NET_ADMIN ケーパビリティ) なしでファイアウォールの設定を変更しようとした。 スーパーユーザー権限 ( CAP_NET_BIND_SERVICE ケーパビリティ) なしで特権ポートにバインドしようとした。
- EADDRINUSE
- 既に使用されているアドレスにバインドしようとした。
- EADDRNOTAVAIL
- 存在しないインターフェースが要求された。または 要求されたソースアドレスがローカルでない。
- EAGAIN
- 非ブロッキングソケットに対してブロックする操作を行った。
- EALREADY
- 非ブロッキングソケットに対する接続操作が既に実行中である。
- ECONNABORTED
- accept(2) の途中で接続がクローズされた。
- EHOSTUNREACH
- 宛先アドレスにマッチする有効なエントリがルーティングテーブルに 存在しない。このエラーはリモートルータからの、 あるいはローカルルーティングテーブルへの ICMP メッセージによって引き起こされることがある。
- EINVAL
- 不正な引き数が渡された。送信操作において、 blackhole ルートに送信しようとするとこのエラーが起こることがある。
- EISCONN
- 接続済みのソケットに対して connect(2) が呼ばれた。
- EMSGSIZE
- データグラムが path MTU よりも大きく、フラグメント化もできない。
- ENOBUFS, ENOMEM
- 空きメモリが足りない。 このエラーは、メモリアロケーションがソケットバッファの 大きさによって制限されていることを意味しているのが通常であるが、 100% そうだというわけではない。
- ENOENT
- パケットが到着していないソケットに対して SIOCGSTAMP が呼ばれた。
- ENOPKG
- カーネルサブシステムが設定されていない。
- ENOPROTOOPT と EOPNOTSUPP
- 無効なソケットオプションが渡された。
- ENOTCONN
- 接続されていないソケットに対して、 接続状態でしか定義されていない操作を行おうとした。
- EPERM
- 高い優先度を設定したり、設定を変更したり、要求されたプロセスや プロセスグループにシグナルを送ったりするのに必要な権限を、 ユーザーが持っていない。
- EPIPE
- 接続が接続相手によって、予期しないやり方でクローズまたはシャットダウンされた。
- ESOCKTNOSUPPORT
- ソケットが未設定であるか、知らないソケットタイプが要求された。
注意¶
IP_FREEBIND, IP_MTU, IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT, and IP_TRANSPARENT は Linux 固有である。移植性¶
Linux 2.0 との互換性のために、 obsolete な socket(AF_INET, SOCK_PACKET, protocol) という書式でも packet(7) をオープンできるようになっているが、これはお勧めできない。今後は socket(AF_PACKET, SOCK_RAW, protocol) を代わりに用いるべきである。主な違いは、ジェネリックなリンク層用の sockaddr_ll アドレス構造体が、古い sockaddr_pkt に変わって用いられるようになったことである。バグ¶
エラーの値がまったく首尾一貫していない。 IP 固有のインターフェースオプションを指定するための ioctl と ARP テーブルのことが記述されていない。 glibc のバージョンによっては in_pktinfo の定義を忘れているものがある。 現時点でのとりあえずの対策としては、この man ページにある定義をプログラム中に コピーすることである。 recvmsg(2) で msg_name に MSG_ERRQUEUE を指定して、受信パケットに入っていた宛先アドレスを取得する方法は 2.2 カーネルの一部でうまく動かない。関連項目¶
recvmsg(2), sendmsg(2), byteorder(3), ipfw(4), capabilities(7), netlink(7), raw(7), socket(7), tcp(7), udp(7) RFC 791: オリジナルの IP の仕様この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2011-09-22 | Linux |