EN JA
SCTP_SENDMSG(3)
SCTP_SENDMSG(3) FreeBSD Library Functions Manual SCTP_SENDMSG(3)

名称

sctp_sendmsg, sctp_sendmsgxSCTP ソケットへメッセージを送信する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/types.h>
#include < sys/socket.h>
#include < netinet/sctp.h>

ssize_t
sctp_sendmsg( int s, const void *msg, size_t len, const struct sockaddr *to, socklen_t tolen, uint32_t ppid, uint32_t flags, uint16_t stream_no, uint32_t timetolive, uint32_t context);

ssize_t
sctp_sendmsgx( int s, const void *msg, size_t len, const struct sockaddr *to, int addrcnt, uint32_t ppid, uint32_t flags, uint16_t stream_no, uint32_t timetolive, uint32_t context);

解説

sctp_sendmsg() システムコールは、メッセージを別の SCTP 終点 (endpoint) に転送するために使用されます。 sctp_sendmsg() は、いつでも、使用できます。ソケットが 1 対多のタイプ (SOCK_SEQPACKET) のソケットであるなら、存在しないアソシエーションであるアドレスへ送信する試みは、暗黙のうちに新しいアソシエーションを作成します。そのようなインスタンスのデータ送信は、SCTP の 4 つの方法のハンドシェイクの 3 番目の行程で送信されるデータをもたらします。ソケットが 1 対 1 のタイプ (SOCK_STREAM) のソケットであるなら、アソシエーションは、 ( connect(2) システムコールの使用によって) 存在していなければならないことに注意してください。接続されれていない 1 対 1 のソケットで sctp_sendmsg() または sctp_sendmsgx() を呼び出すことは、 errnoENOTCONN に設定され、-1 が返され、メッセージが、送信されない結果となります。

ターゲットのアドレスは、そのサイズを tolen で指定して to で与えられます。メッセージ msg の長さは、 len で与えられます。メッセージが基本的なプロトコルを通して不可分に渡されるには長すぎるなら、 errno は、 EMSGSIZE に設定されて -1 が返され、メッセージは、送信されません。

配信のための失敗の兆候なしに、 sctp_sendmsg(3) 呼び出しで暗黙ではありません。局所的に検出されたエラーは、-1 の返り値によって示されます。

転送されるメッセージを保持するための空間がソケットで利用可能でないなら、 sctp_sendmsg(3) は、ソケットが非ブロッキング I/O モードに置かれていないなら、通常、ブロックします。 select(2) システムコールは、より多くのデータを 1 対 1 のタイプ (SOCK_STREAM) のソケットに送信することが、いつ可能となるかを決定するために使用されます。

ppid 引数は、スタックからピア (相手側) 終点に透過的に渡される 32 ビットの不透明な (サイズおよび形がわからない) 値です。それはメッセージの受信で利用可能となります ( sctp_recvmsg(3) 参照)。スタックは、バイト順に関係なしでこの値を渡すことに注意してください。

flags 引数は、次の 1 つ以上を含みます:

#define SCTP_EOF    0x0100 /* シャットダウン手順を始める */ 
#define SCTP_ABORT   0x0200 /* ABORT をピアに送信する */ 
#define SCTP_UNORDERED    0x0400 /* メッセージは不規則です */ 
#define SCTP_ADDR_OVER   0x0800 /* 主要なアドレスを上書きする */ 
#define SCTP_SENDALL      0x1000 /* これを終点に対してすべての */ 
                                        /* アソシエーションに送信する */ 
/* 下位バイトは PR-SCTP ポリシの列挙です */ 
#define SCTP_PR_SCTP_TTL  0x0001 /* PR-SCTP ベースの時間 */ 
#define SCTP_PR_SCTP_BUF  0x0002 /* PR-SCTP ベースのバッファ */ 
#define SCTP_PR_SCTP_RTX  0x0003 /* PR-SCTP ベースの再転送の数 */

フラグ SCTP_EOF は、このメッセージをキューに入れ、次に、アソシエーションの素直なシャットダウンを始めるように SCTP スタックに命令するために使用されます。キュー中のすべての残っているデータは、アソシエーションがシャットダウンされた後に送信されます。

SCTP_ABORT は、直ちにアソシエーションを終了するために使用されます。アボートが、ピアに送信され、ローカル TCB は、破壊されます。

SCTP_UNORDERED は、送信されるメッセージには、特有の順序がなく、できるだけ早く、ピアアプリケーションに配信されるべきであることを指定するために使用されます。このフラグが欠けているとき、メッセージは、ピアストリームの順序に関係なく、それらが送信されるストリームの中で順番に配信されます。

フラグ SCTP_ADDR_OVER は、特定のアドレスが使用されるべきであることを指定するために使用されます。通常、SCTP は、送信される主要なアドレスとして、マルチホームのピアアドレスの 1 つのみを使用します。デフォルトで、この主要なアドレスは、たとえ to 引数であろうとも、データを送信するために使用されます。このフラグを指定することによって、ユーザは、主要なアドレスを無視するように、スタックに問い合わせ、また、送信するための実際のアドレスとしてではなく、アソシエーションを見つける検索メカニズムとしてのみでない指定されたアドレスを代わりに使用します。

1 対多のタイプ (SOCK_SEQPACKET) のソケットのために、 1 つの送信の呼び出し行い、ソケットがメッセージのコピーを取得する最中にすべてのアソシエーションを持つ、便利な方法として、フラグ SCTP_SENDALL を使用することができます。このメカニズムは、かなり効率的であり、送信のためのすべてのアソシエーションによって共有されるデータの 1 つの実際のコピーだけを作ることに注意してください。

残りのフラグは、部分的な信頼性の拡張 (RFC3758) のために使用され、ピア終点がこの拡張をサポートする場合にだけ、効果的になります。このオプションは、ローカルな終点がデータをスキップする際にどのようなローカルなポリシを使用するべきであるかを指定します。これらのオプションがなにも設定されていないなら、データは決してスキップされません。

SCTP_PR_SCTP_TTL は、存続期間をベースとする時間がデータに適用されていることを示すために使用されます。つぎに timetolive 引数は、データが転送されることを試みられる多くのミリ秒です。多くのミリ秒が経過して、ピアがデータを承認していないなら、データは、スキップされ、もはや送信されません。このポリシは、データがかつて送信されることさえ保証しないことに注意してください。多量のデータがキューに入れられて混雑する場合に、最初の転送が行われる前に timetolive は、期限が切れるかもしれません。

SCTP_PR_SCTP_BUF ベースのポリシは、 timetolive フィールドを外向きの送信キューで許された合計のバイト数に変換します。その数か、またはより多くのバイトがキューに入れられているなら、他のバッファベースの送信が、削除するために検索され、スキップされます。また、このポリシは、バッファベースの送信がキューになく、 timetolive バイトによって指定された最大がキューに入れられているなら、データが決して送信されないことに注意してください。

SCTP_PR_SCTP_RTX ポリシは、 timetolive を許可する再転送のの数に変換します。このポリシは、常に最小で 1 つの送信がデータで試みられることを保証します。その後、わずか timetolive の再転送が、データをスキップする前に行われます。

stream_no は、利用者がメッセージを送信したい SCTP ストリームです。 SCTP のストリームは、規則付けられたメッセージの信頼できる (または、部分的に信頼できる) フロー (流れ) です。 context フィールドは、メッセージを送信することができないイベントだけに使用されます。これは、その通知が有効であるなら、 ( sctp(4) 参照) 失敗した送信が与えられるとき、スタックが保有し、ユーザに与える不透明な (サイズおよび形がわからない) 値です。通常、ユーザプロセスは、送信を実行することができないとき、いくつかのアプリケーション特有のデータ構造にインデックスを付けるこの値を使用することができます。 sctp_sendmsgx() は、引数 to で sockaddr 構造の配列を取り、いくつのアドレスが配列中にあるかを指定する追加引数 addrcnt を追加することを除いて、 sctp_sendmsg() と同じです。これによって、呼び出し側は、まるで sctp_connectx() がアソシエーションを設定するために呼び出されているかのように複数のアドレスを渡すアソシエーション暗黙のうちに設定できます。

戻り値

呼び出しは、送信された文字数を返し、エラーが発生したなら、-1 を返します。

エラー

sctp_sendmsg() システムコールは、次の場合に失敗します:
[ EBADF]
無効の記述子が、指定されました。
[ ENOTSOCK]
引数 s が、ソケットではありません。
[ EFAULT]
無効のユーザ空間のアドレスが、引数に指定されました。
[ EMSGSIZE]
ソケットは、メッセージが不可分に送信されることを必要とし、送信されるメッセージのサイズで、これは不可能となります。
[ EAGAIN]
ソケットは、非ブロッキングとマークされ、要求された操作は、ブロックされます。
[ ENOBUFS]
システムは、内部のバッファを割り付けることができませんでした。バッファが利用可能になるとき、操作は成功するかもしれません。
[ ENOBUFS]
ネットワークインタフェースの出力キューが、満杯でした。一般的に、これは、インタフェースが、送信することを停止しましたが、一時的な輻輳によって引き起こされるかもしれないことを示します。
[ EHOSTUNREACH]
リモートホストが、到達不可能でした。
[ ENOTCONN]
1 対 1 のスタイルのソケットでは、アソシエーションは、存在しません。
[ ECONNRESET]
ユーザが、データをピアに送信することを試みていた間に、スタックによってアボートを受信しました。
[ ENOENT]
1 対多のスタイルのルソケットでは、アドレスは、指定されないので、アソシエーションを、位置づけることができないか、または SCTP_ABORT フラグは、存在しないアソシエーションで指定されました。
[ EPIPE]
ソケットは、それ以上データを送信することができません ( SBS_CANTSENDMORE は、ソケットで設定されています)。これは、ソケットが接続されていなくて、1 対 1 のスタイルのソケットであることを通常意味します。

バグ

1 対多のスタイルのソケットでは、 sctp_sendmsg() または sctp_sendmsgx() は、1 つの終点で複数のアソシエーションがあるので、書き込みでの選択は、1 対 1 のスタイルのソケットのためだけに動作します。
December 15, 2006 FreeBSD