次のようにlinu IOインタフェースは用意されています。
- 読み取りおよび書き込み - 読みするのが最も簡単かつ書き込み機能
- readnと書か - アトミック読み取りおよび書き込み操作
- recvfromとのsendto - は、宛先アドレスとアドレスの構造パラメータの長さを増加させます
- RECVと送信 - カーネル渡されるフラグに処理を許可します
- READVとwritev - あなたは、データがどのバッファからの入力または出力データであると指定することができます
- recvmsgとsendmsgの - IOは、補助データの能力を含む特性の他の全ての機能を組み合わせて、受信および送信
次のようにそれらの間の違いは次のとおりです。
機能 | 任意の記述子を使用します | 唯一のソケット記述子 | 単一の読み取りと書き込みバッファ | ストライピングバッファ | オプションのフラグ | オプションのピアアドレス | オプションの制御情報 |
読み書き | • | • | |||||
READV writev | • | • | |||||
recv送信 | • | • | • | ||||
recvfromはsendto | • | • | • | • | |||
recvmsg sendmsgの | • | • | • | • | • |
RECVと送信
関数原型
ssize_tのRECV (int型の数sockfd 、無効* バフ、size_tのnbytesは、int型のフラグ);
ssize_tの送信(int型の数sockfd 、CONST 無効* バフ、size_tのnbytesは、int型のフラグ);
コールリターンに成功し、入力または出力バイト、エラー-1
標準読み出しおよび書き込み機能を備えたこの2つの機能の間の唯一の違いは、それらの標準的な読み出し及び書き込み機能と、flagsパラメータ、フラグパラメータ0の付加であります
フラグパラメータ
一つ以上の定数論理値またはリスト、または値を削除することができ、パラメータフラグ0
参照「のrecvmsgとsendmsgの機能」とは、入力と出力の機能は表フラグに要約されている説明します
MSG_WAITALLがrecv関数readn完全に同等の機能を設定し、のみ次のいずれかが要求されたデータよりも少ないバイト数を返しますが発生した場合:
- シグナルによって割り込ま
- 接続が終了されます
- ソケットエラー
READV和writev
関数原型
ssize_tのREADV (int型filedesが、constの構造体IOVEC * IOV 、INT iovcnt )。
ssize_tのwritev (int型filedesが、constの構造体IOVEC * IOV 、INT iovcnt )。
これは、SYS / uio.h内で定義されています
呼び出しが成功しそうでない場合、バイトの読み取りや書き込みの数を返します-1
機能説明
これらの2つの関数は、関数の読み書きに非常に類似しているが、READV writevおよび1つまたは複数のバッファから単一の読み取りまたは書き込みシステムコールを許可し、入力から「分散」と「書き込みフォーカス」、読み出し動作と呼ばれデータは、アプリケーション複数のバッファに分配され、複数のアプリケーションを同時に出力データ・バッファは、単一の書き込み動作を提供するために濃縮しました。
もちろん、READVと機能がどのwritev記述子で使用することができますが、ソケット記述に限定されるものではなく
一方、writevは、プロトコル(例えばUDP)レコードを、各オペレータwritevのみデータパケットを生成することを意味し、アトミック操作であります
パラメータ説明
- IOVEC
2番目のパラメータはポインタ配列構造IOVECに記憶された最初のアドレスの関数であり、IOVEC構造はのSYS / uio.hで定義されています。
1つの 構造体IOVEC 2 { 3 ボイド * iov_base。 4 size_t型のiov_len。 5 }
SYS / uio.h IOV_MAXは、アレイ内のアイドルIOVEC最大構成要素の数を定数を定義しました
iov_lenはバッファ長を保存しながらIOVECは、バッファ先頭アドレスセーブiov_base、バッファ構造であります
recvmsgの和は、sendmsg
関数原型
ssize_tののrecvmsg (int型数sockfd 、構造体のmsghdr * MSG 、int型のフラグ);
ssize_tのは、sendmsg (int型数sockfd 、構造体のmsghdr * MSG 、int型のフラグ);
sys / socket.hで定義されて
コールリターンに成功し、入力または出力バイト、そうでない場合は-1
機能説明
これらの2つの関数は、最も一般的なIO機能は、実際には、我々はすべてのIO操作は、これら2つの機能で実現されて置くことができます
パラメータ説明
- MSG
これら二つの機能は、ほとんどのパラメータのmsghdr構造体に詰め込まれています。
ストラクト体msghdr { ボイド ; *はmsg_name // のソケットアドレス構造体 ; msg_namelenのsocklen_tを ストラクト、IOVEC *のmsg_iovを//は構造配列バッファ INT msg_iovlenと、 ボイド * Sフィールドmsg_control; // の追加のデータアレイ msg_controllenのsocklen_tフィールド; INT msg_flags; // のみのrecvmsg値として機能用途、 -結果パラメータ戻り }
ドメイン | 説明 |
msg_name | このようなTCP接続又はプロトコルアドレス(指定する必要がない場合は、ソケットは、レシピエント(sendmsgの)または送信者(のrecvmsg)プロトコルアドレス保存場合(例えば、UDP)、ソケットアドレス構造体へのポインタに接続されていませんUDPソケット)はNULLポインタに設定されています |
msg_namelen | アドレス構造体のサイズははmsg_nameを指摘しました |
msg_iov | 構造アレイIOVEC先頭アドレスを指し、すなわち、バッファアレイのアレイ、及びREADV writevにパラメータの二つの機能を導入することが記載されています |
msg_iovlen | 配列msg_iovの要素数を指定します。 |
msg_control | 必要に応じて、補助データの最初のアドレスアレイ |
msg_controllen | 配列要素のSフィールドmsg_control番号(のrecvmsg関数の値である - 結果パラメータ) |
msg_flags | フラグ変数 |
- MSGのパラメータとフラグパラメータmsg_flags
私たちは、構造をmsg_flagsのmsghdrのメンバーとのフラグのパラメータを区別する必要があります。
- recvmsg使用msg_flags部材、のrecvmsgが呼び出されたときに、そのコアの値を用いてmsg_flagsメンバーにコピーされたパラメータフラグが受信するプロセスを駆動し、その結果に基づいて更新msg_flagsメンバーのみ
- 彼は直接flagsパラメータ駆動型のプロセスを送信したためにsendmsgはmsg_flagsメンバーを無視されます
マーク | 説明 | 機能フラグを送信 | レシーバ機能フラグ | msg_flagsリターン |
MSG_DONTROUTE | (直接ローカルネットワークに接続された上で、宛先ホスト)ルーティングテーブルのルックアップをバイパス | • | ||
MSG_DONTWAIT | この操作は、ノンブロッキング | • | • | |
MSG_PEEK | ピープ外国データ | • | ||
MSG_WAITALL | (カーネルはまだそれがすべてになるまでのバイト数を返すことを読み取り要求されていない)、すべてのデータを待っています | • | ||
MSG_EOR | 終了レコード(これはSOCK_SEQPACKETソケットタイプのため、通常は便利です) | • | • | |
MSG_OOB | バンドデータを送信または受信 | • | • | • |
MSG_BCAST | データリンク層パケット受信した宛先アドレスがブロードキャストまたはブロードキャストアドレスであります | • | ||
MSG_MCAST | 充電されたデータリンク層マルチキャストパケット | • | ||
MSG_TRUNC | データは、(コア復帰準備処理バッファ空間より多くのデータを)切り捨てられる報告しました | • | ||
MSG_CTRUNC | この補助データパケットが切り捨てられる(複数格納することができるよりも、補助データ作成msg_control戻るのコアサイズ) | • | ||
MSG_NOTIFICATION | SCTPは、イベント通知メッセージデータでないバンドデータを受信し | • |
ショー下図時間のrecvmsgリターンの例:
補助制御情報(msg_control、msg_controllen部材)
補助データが送信され、使用済みのmsghdrのmsg_control構造とsendmsgのメンバーmsg_controllenを呼び出すことによって、二つの機能とのrecvmsgを受け取ることができます
msg_control部材は、アレイcmsghdr構造体は、以下に記載されています
1 struct cmsghdr 2 { 3 socklen_t cmsg_len; 4 int cmsg_level; 5 int cmsg_type; 6 unsigned char cmsg_data[]; 7 }
- 辅助数据结构用法:
协议 | cmsg_level | cmsg_type | 说明 |
IPv4 | IPPROTO_IP | IP_REVDSTADDR | 随 UDP 数据报接收目的地址 |
• | • | IP_RECVIF | 随 UDP 数据报接收接口索引 |
IPv6 | IPPROTO_IPV6 | IPV6_DSTOPTS | 指定/接收目的地选项 |
• | • | IPV6_HOPLIMIT | 指定/接收跳限 |
• | • | IPV6_HOPOPTS | 指定/接收步跳选项 |
• | • | IPV6_NEXTHOP | 指定下一跳的地址 |
• | • | IPV6_PKTINFO | 指定/接收分组信息 |
• | • | IPV6_RTHDR | 指定/接收路由首部 |
• | • | IPV6_TCLASS | 指定/接收分组流通类别 |
UNIX域 | SOL_SOCKET | SCM_RIGHTS | 发送/接收描述符 |
• | • | SCM_CREDS | 发送/接收用户凭证 |
- 辅助数据处理函数
下面列出了 5 个宏用来简化对辅助数据的处理
1 struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mhdrptr); 2 // 返回指向第一个 cmsghdr 结构的指针或为 NULL 3 struct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr); 4 // 返回指向 cmhdrptr 下一个辅助对象指针或为 NULL 5 unsigned char *CMSG_DATA(struct cmsghdr *cmsgptr); 6 // 返回指向 cmsghdr 结构关联的数据的第一个字节的指针 7 unsigned int CMSG_LEN(unsigned int length); 8 // 返回给定数据量下存放到 cmsg_len 中的值 9 unsigned int CMSG_SPACE(unsigned int length); 10 // 返回给定数据量下一个辅助数据对象总的大小
文章内容来源于:https://techlog.cn/article/list/10182663