accept(2) FreeBSD 一般コマンドマニュアル

accept

前のページ 上に戻る 次のページ

accept




書式

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

     int
     accept(int s, struct sockaddr *addr, socklen_t *addrlen);


解説

     引数 ssocket(2) で作成され、 bind(2) でアドレスにバインドされ、
     listen(2) も済ませて接続を待ち受けているソケットです。 accept() 呼び出し
     は、待ち行列上の最初の接続要求を取り出し、 s と同じプロパティの新しいソ
     ケットを作成し、ソケットのための新しいファイル記述子を割り当てます。接続
     要求が待ち行列上に存在せず、しかもソケットが非ブロッキングとマークされて
     いない場合、 accept() は接続要求があるまで呼び出し側をブロックします。ソ
     ケットが非ブロッキングとマークされており、しかも待ち行列に接続要求が存在
     しない場合、 accept() は後述のようにエラーを返します。接続が成立したソ
     ケットは、それ以上の接続を受け入れるために使用できません。オリジナルのソ
     ケット s は開いたままです。

     引数 addr は結果パラメータで、通信レイヤに既知の接続エンティティのアドレ
     スで埋められます。 addr パラメータの正確な形式は通信が行なわれるドメイン
     で決まります。 addrlen は、「値 - 結果」パラメータです。これは最初は addr
     が指す空間のサイズを含んでいなければなりません。戻り時には、返されるアド
     レスの実際の長さ (バイト単位) を含むことになります。この呼び出しは、コネ
     クションをベースとしたソケットタイプ、現在では SOCK_STREAM とともに使用さ
     れます。

     読取りでソケットを select(2) することによって、 accept() するソケットを選
     ぶことができます。

     ISO または DATAKIT のような明瞭な確認が必要な特定のプロトコルでは、
     accept() は単に次の接続要求を待ち行列から除くだけで、確認は行わないと考え
     られます。確認は、新しいファイル記述子についての通常の読取りまたは書込み
     によって行うことができ、拒絶は新しいソケットを閉じる事によって実現できま
     す。

     msg_iovlen を 0 に、 msg_controllen を 0 でない値に設定して recvmsg(2) を
     発行することによって、または getsockopt(2) を発行することによって、確認な
     しにユーザ接続要求データを得ることができます。同じように、制御情報だけを
     指定して sendmsg(2) を発行することによって、または setsockopt(2) を発行す
     ることによって、ユーザ接続拒絶情報を提供できます。


実装に関する注

     非スレッドライブラリで accept() は accept システムコールとして実装されま
     す。

     スレッドライブラリでは、 accept システムコールは _thread_sys_accept() に
     アセンブルされ、 accept() は、読取りと書込み用に s をロックしてから、
     _thread_sys_accept() を呼び出す関数として実装されます。
     _thread_sys_accept() への呼び出しがブロックする場合はコンテキストスイッチ
     が実行されます。戻る前に accept() は s をアンロックします。
     [ENFILE]           システムファイルテーブルが満杯です。

     [ENOTSOCK]         記述子がファイルを参照しておりソケットではありません。

     [EINVAL]           listen(2) がソケット記述子に対して呼び出されていませ
                        ん。

     [EFAULT]           addr パラメータがユーザアドレス空間の書込み可能な部分
                        にありません。

     [EWOULDBLOCK]      ソケットが非ブロッキングとマークされ、さらに受け付ける
                        べき接続要求が存在しません。

     [ECONNABORTED]     接続要求が到着しましたが、待ち行列で待機している間に閉
                        じてしまいました。


関連項目

     bind(2), connect(2), getpeername(2), listen(2), select(2), socket(2)


歴史

     accept() 関数は 4.2BSD で登場しました。

FreeBSD 4.4                    December 11, 1993                   FreeBSD 4.4

ABELNET VPSサービス