Linuxのネットワークプログラミングの研究ノート(5) - IO操作とデータ送受信

次のようにlinu IOインタフェースは用意されています。

  1. 読み取りおよび書き込み - 読みするのが最も簡単かつ書き込み機能
  2. readnと書か - アトミック読み取りおよび書き込み操作
  3. recvfromとのsendto - は、宛先アドレスとアドレスの構造パラメータの長さを増加させます
  4. RECVと送信 - カーネル渡されるフラグに処理を許可します
  5. READVとwritev - あなたは、データがどのバッファからの入力または出力データであると指定することができます
  6. recvmsgとsendmsgの - IOは、補助データの能力を含む特性の他の全ての機能を組み合わせて、受信および送信

次のようにそれらの間の違いは次のとおりです。

5 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型のフラグ;
sys / socket.hで定義されて

コールリターンに成功し、入力または出力バイト、エラー-1

標準読み出しおよび書き込み機能を備えたこの2つの機能の間の唯一の違いは、それらの標準的な読み出し及び書き込み機能と、flagsパラメータ、フラグパラメータ0の付加であります

フラグパラメータ

一つ以上の定数論理値またはリスト、または値を削除することができ、パラメータフラグ0

参照「のrecvmsgとsendmsgの機能」とは、入力と出力の機能は表フラグに要約されている説明します

MSG_WAITALLがrecv関数readn完全に同等の機能を設定し、のみ次のいずれかが要求されたデータよりも少ないバイト数を返しますが発生した場合:

  1. シグナルによって割り込ま
  2. 接続が終了されます
  3. ソケットエラー

 


 

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のみデータパケットを生成することを意味し、アトミック操作であります

パラメータ説明

  1. 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、バッファ構造であります

 


 

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値として機能用途、 -結果パラメータ戻り 
}
 
msghdr構造体の説明
ドメイン 説明
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のメンバーとのフラグのパラメータを区別する必要があります。

  1. recvmsg使用msg_flags部材、のrecvmsgが呼び出されたときに、そのコアの値を用いてmsg_flagsメンバーにコピーされたパラメータフラグが受信するプロセスを駆動し、その結果に基づいて更新msg_flagsメンバーのみ
  2. 彼は直接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

 

 

おすすめ

転載: www.cnblogs.com/WenLee/p/12159041.html