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

名称

sctp_recvmsgSCTP ソケットからメッセージを受信する

ライブラリ

Standard C Library (libc, -lc)

書式

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

ssize_t
sctp_recvmsg( int s, void *msg, size_t len, struct sockaddr * restrict from, socklen_t * restrict fromlen, struct sctp_sndrcvinfo *sinfo, int *flags);

解説

sctp_recvmsg() システムコールは、別の SCTP 終点 (endpoint) からメッセージを受信するために使用されます。 sctp_recvmsg() 呼び出しは、 connect() 呼び出しが成功した後、またはアプリケーションが listen() 続いて成功した accept() を実行した後に、1 対 1 の (SOCK_STREAM) タイプソケットによって使用されます。 1 対多の (SOCK_SEQPACKET) タイプソケットに関して、終点は、 sctp_sendmsg(), sendto() と sendmsg() を含む送信呼び出しの 1 つを通してアソシエーションを暗黙のうちに開始された後に、 sctp_recvmsg() を呼び出します。または、アプリケーションは、新しいアソシエーションの受信を有効にするために明確なバックログで listen() を呼び出した後に、メッセージも受信します。

送信側のアドレスは、 from 引数に保持され、そのサイズは、 fromlen で指定します。 sctp_recvmsg() 呼び出しが成功して完了するときに、 from は、ピア (相手側) のアドレスを保持し、 fromlen は、そのアドレスの長さを保持します。アドレスは、入出力変数として使用される fromlen の初期値によってバインド (制限) されていることに注意してください。

受信されるメッセージ msg の長さは、 len によってバインド (制限) されています。メッセージがユーザの受信バッファに適合せず長すぎるなら、 flags 引数は、適用された MSG_EOF フラグが ありません。メッセージが完全なメッセージであるなら、 flags 引数には、 MSG_EOF 設定があります。局所的に検出されたエラーは、それに応じて、設定された errno で -1 の返り値によって示されます。また、 flags 引数は、値 MSG_NOTIFICATION を保持します。これが起こるとき、受信されたメッセージがピアの終点からでは ない ことを示しますが、 SCTP スタック (より詳しい情報については、 sctp(4) 参照) からの通知です。ユーザが SCTP_EVENTS ソケットオプションを使用してそのような通知に同意しないなら、通知が決して与えられないことに注意してください。

メッセージがソケットで利用可能でないなら、通常、 sctp_recvmsg() は、ソケットが非ブロッキング I/O モードに置かれていないなら、メッセージまたは NOTIFICATION (通知) の受信をブロックします。 select(2) システムコールは、メッセージを受信することが可能であるかどうか決定するために使用されます。

sinfo 引数は、次のように定義されます。

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; /* sctp_recvmsg によって使用されない */ 
 uint32_t sinfo_tsn;        /* 転送シーケンス番号 */ 
 uint32_t sinfo_cumtsn;     /* 累積承認ポイント */ 
 sctp_assoc_t sinfo_assoc_id; /* ピアのアソシエーション ID */ 
};

sinfo->sinfo_ppid フィールドは、ピア終点からスタックを通して透過的に渡された不透明な (サイズおよび形がわからない) 32 ビット値です。スタックは、バイト順に関係なくこの値を渡すことに注意してください。

sinfo->sinfo_flags フィールドは、次を含みます:

#define SCTP_UNORDERED    0x0400 /* メッセージは不規則 */

SCTP_UNORDERED フラグは、メッセージが特定の順序なしで到着し、できるだけ早く、ピアアプリケーションに配信されることを指定するために使用されます。このフラグがないとき、メッセージは、受信されたストリーム内の順序で配信されます。

sinfo->sinfo_stream フィールドは、メッセージが受信された SCTP ストリームです。 SCTP 中のストリームは、順序付けられたメッセージの信頼できる (または部分的に信頼できる) フロー (流れ) です。

sinfo->sinfo_context フィールドは、ローカルのアプリケーションが SCTP_CONTEXT ソケットオプションでアソシエーションレベルコンテキストを設定する場合にだけ使用されます。オプションで、ユーザプロセスは、特定のアソシエーションから来るすべてのデータのためにいくつかのアプリケーション特有のデータ構造にインデックス付けするためにこの値を使用することができます。

sinfo->sinfo_ssn フィールドは、メッセージが不規則で ない なら、ピアの終点によって割り当てられるストリームのシーケンス番号を保持します。不規則なメッセージに関して、このフールドは、未定義値を保持します。

sinfo->sinfo_tsn フィールドは、ピア終点によってこのメッセージに割り当てられた転送シーケンス番号 (transport sequence number) (TSN) を保持します。パス MTU に適合するか、または以下のメッセージに関して、これは、割り当てられた唯一の TSN になります。複数の TSN にまたがるメッセージに関して、この値は、メッセージで使用された TSN の 1 つになることに注意してください。

sinfo->sinfo_cumtsn フィールドは、転送アソシエーションの現在の累積された承認ポイントを保持します。これは、メッセージ自体に割り当てられた TSN より大きいか、または小さいかもしれないことに注意してください。

sinfo->sinfo_assoc_id は、アソシエーションに割り当てられたユニークなアソシエーション識別です。 1 対多 (SOCK_SEQPACKET) のタイプソケットに関して、アドレスフィールドの使用なしでデータをピアに送信するためにこの値を使用することができます。また、特有のアソシエーション ( sctp(4) 参照) で様々なソケットオプションを設定するためにとても役に立ちます。

sinfo->info_timetolive フィールドは、 sctp_recvmsg() では使用されません。

戻り値

呼び出しは、受信されたバイト数を返し、エラーが発生したなら、-1 を返します。

エラー

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