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

名称

sctp_send, sctp_sendxSCTP ソケットにメッセージを送信する

ライブラリ

Standard C Library (libc, -lc)

書式

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

ssize_t
sctp_send( int sd, const void *msg, size_t len, const struct sctp_sndrcvinfo *sinfo, int flags);

ssize_t
sctp_sendx( int sd, const void *msg, size_t len, struct sockaddr *addrs, int addrcnt, const struct sctp_sndrcvinfo *sinfo, int flags);

解説

sctp_send() システムコールは、別の SCTP 終点 (endpoint) に転送するためにに使用されます。 sctp_send() は、1 対多の (SOCK_SEQPACKET) と 1 対 1 の (SOCK_STREAM) のソケットのタイプの両方のための既存のアソシエーションにデータを送信するために使用されます。メッセージ msg の長さは len によって与えられています。メッセージが基本的なプロトコルを通して不可分に渡すためには長すぎるなら、 errno は、 EMSGSIZE に設定されて、-1 が返され、メッセージは、送信されません。

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

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

sinfo 構造は、様々な SCTP の機能を制御するために使用され、次の形式があります:

struct sctp_sndrcvinfo { 
 uint16_t sinfo_stream;  /* ストリーム発信 */ 
 uint16_t sinfo_ssn;     /* 受信のみ有効 */ 
 uint16_t sinfo_flags;   /* 送信を制御するフラグ */ 
 uint32_t sinfo_ppid;    /* ppid フィールド */ 
 uint32_t sinfo_context; /* コンテキストフィールド */ 
 uint32_t sinfo_timetolive; /* PR-SCTP に対する有効期間 */ 
 uint32_t sinfo_tsn;        /* 受信のみ有効 */ 
 uint32_t sinfo_cumtsn;     /* 受信のみ有効 */ 
 sctp_assoc_t sinfo_assoc_id; /* アソシエーション ID */ 
};

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

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

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

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

sinfo->sinfo_stream は、利用者がメッセージを送信したい SCTP ストリームです。 SCTP のストリームは、規則付けられたメッセージの信頼できる (または、部分的に信頼できる) フロー (流れ) です。

sinfo->sinfo_assoc_id フィールド野は、1 対多のソケットで送信するためのアソシエーションを選択するために使用されます。 1 対 1 のソケットに関して、このフィールドは、無視されます。

sinfo->sinfo_context フィールドは、メッセージを送信することができないイベントにだけ使用されます。これは、その通知が有効であるなら、 ( sctp(4) 参照) 失敗した送信が与えられるとき、スタックが保有し、ユーザに与える不透明な (サイズおよび形がわからない) 値です。通常、ユーザプロセスは、送信を実行することができないとき、いくつかのアプリケーション特有のデータ構造にインデックスを付けるこの値を使用することができます。

flags 引数は、 sendmsg(2) で見つけられたものとして同じ意味と値を保持しますが、一般的に、SCTP によって無視されます。

フィールド sinfo->sinfo_ssn, sinfo->sinfo_tsnsinfo->sinfo_cumtsn は、メッセージを受信するときだけ使用され、したがって sctp_send() によって無視されます。関数 sctp_sendx() には、渡された sockaddr 構造体の配列の追加引数で sctp_send() としていくつかのプロパティ (特性) があります。送信されるアドレスの配列として与えられている addrs 引数とともに、いくつのソケットアドレスがあるかを示す addrcnt 引数は、配列で渡されます。アドレスのすべては、暗黙のアソシエーションが設定されるときだけ、使用されることに注意してください。これによって、アソシエーションへの sctp_send() が続く sctp_connectx() を行うような、ユーザと同等な振る舞いができます。 sinfo->sinfo_assoc_id フィールドが 0 であるなら、最初のアドレスは、アソシエーション ID の代わりにアソシエーションを検索するために使用されることに注意してください。アドレスとアソシエーション ID の両方が指定されるなら、アソシエーション ID が優先されます。

戻り値

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

エラー

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

バグ

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