Unix-system-calls-accept

提供:Dev Guides
移動先:案内検索

[top]#

|http://www.google.com/[Google] | a|

Web This Site
  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

[cols=",,,,,,,",]

| |  Home   | |  References   | |  Discussion Forums   | |  About TP  

[width="100%",cols="100%",]

a| == accept()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

accept-ソケットの接続を受け入れます

概要

#include <sys/types.h> #include <sys/socket.h> int accept(int sockfd, struct sockaddr* addr, socklen_t *addrlen);

説明

*accept* ()システムコールは、接続ベースのソケットタイプ( *SOCK_STREAM* 、 *SOCK_SEQPACKET* )で使用されます。 保留中の接続のキューで最初の接続要求を抽出し、新しい接続ソケットを作成し、そのソケットを参照する新しいファイル記述子を返します。 新しく作成されたソケットはリスニング状態ではありません。 元のソケット_sockfd_は、この呼び出しの影響を受けません。

引数_sockfd_は、 socket (2)で作成され、 bind (2)でローカルアドレスにバインドされ、 listen (2)の後の接続をリッスンしているソケットです。

引数_addr_は、_sockaddr_構造体へのポインターです。 この構造には、通信層が認識しているピアソケットのアドレスが入力されます。 返されるアドレスの正確な形式は、ソケットのアドレスファミリによって決定されます( socket (2)およびそれぞれのプロトコルのマニュアルページを参照)。

_addrlen_引数は、値と結果の引数です。最初は、_addr_が指す構造体のサイズを含める必要があります。返されるとき、返されたアドレスの実際の長さ(バイト単位)が含まれます。 _addr_がNULLの場合、何も書き込まれません。

キューに保留中の接続が存在せず、ソケットが非ブロッキングとしてマークされていない場合、 accept ()は接続が存在するまで呼び出し元をブロックします。 ソケットが非ブロッキングとしてマークされ、キューに保留中の接続が存在しない場合、 accept ()はエラーEAGAINで失敗します。

ソケットへの着信接続の通知を受けるには、 select (2)または poll (2)を使用できます。 新しい接続が試行されると、読み取り可能なイベントが配信され、 accept ()を呼び出してその接続のソケットを取得できます。 または、ソケットでアクティビティが発生したときに SIGIO を配信するようにソケットを設定できます。詳細については、 socket (7)を参照してください。

DECNetなどの明示的な確認を必要とする特定のプロトコルでは、 accept ()は次の接続要求を単にデキューし、確認を暗示するものではないと考えることができます。 確認は、新しいファイル記述子に対する通常の読み取りまたは書き込みによって暗示され、拒否は新しいソケットを閉じることによって暗示されます。 現在、Linuxではこれらのセマンティクスを持っているのはDECNetのみです。

ノート

*SIGIO* が配信された後、または *select* (2)または *poll* (2)が読み取り可能イベントを返した後、接続が待機しているとは限らない場合があります。 accept *()が呼び出されます。 これが発生すると、呼び出しは次の接続の到着を待機してブロックされます。
*accept* ()がブロックされないようにするには、渡されるソケット_sockfd_に *O_NONBLOCK* フラグを設定する必要があります( *socket* (7)を参照)。

返り値

成功すると、 accept ()は、受け入れられたソケットの記述子である負でない整数を返します。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー処理

Linux accept ()は、新しいソケットで保留中のネットワークエラーを accept ()からのエラーコードとして渡します。 この動作は、他のBSDソケット実装とは異なります。 信頼性のある動作のために、アプリケーションは、 accept ()の後にプロトコルに定義されたネットワークエラーを検出し、再試行することで EAGAIN のように扱う必要があります。 TCP/IPの場合、これらは ENETDOWNEPROTOENOPROTOOPTEHOSTDOWNENONETEHOSTUNREACHEOPNOTSUPP 、および ENETUNREACH です。

エラー

*accept* ()は次の場合に失敗します:
Tag Description
EAGAINor*EWOULDBLOCK* The socket is marked non-blocking and no connections are present to be accepted.
EBADF The descriptor is invalid.
ECONNABORTED A connection has been aborted.
EINTR The system call was interrupted by a signal that was caught before a valid connection arrived.
EINVAL Socket is not listening for connections, or addrlen is invalid (e.g., is negative).
EMFILE The per-process limit of open file descriptors has been reached.
ENFILE The system limit on the total number of open files has been reached.
ENOTSOCK The descriptor references a file, not a socket.
EOPNOTSUPP The referenced socket is not of typeSOCK_STREAM.
*accept* ()は次の場合に失敗する可能性があります。
Tag Description
EFAULT The addr argument is not in a writable part of the user address space.
ENOBUFS, ENOMEM Not enough free memory. This often means that the memory allocation is limited by the socket bufferlimits, not by the system memory.
*EPROTO * Protocol error.

Linux* accept *()は、次の場合に失敗する可能性があります。

Tag Description
EPERM Firewall rules forbid connection.

さらに、新しいソケットのネットワークエラーおよびプロトコルに定義されているネットワークエラーが返される場合があります。 さまざまなLinuxカーネルは、 ENOSRESOCKTNOSUPPORTEPROTONOSUPPORTETIMEDOUT などの他のエラーを返す可能性があります。 値 ERESTARTSYS は、トレース中に表示される場合があります。

準拠

SVr4、4.4BSD( accept ()は4.2BSDで初めて登場しました)。

NOTE

*accept* ()の3番目の引数は、もともと「int *」として宣言されていました(libc4およびlibc5の下、および4.x BSD、SunOS 4、SGIなどの他の多くのシステムでは)。 POSIX.1gドラフト標準は、それを「size_t *」に変更することを望んでおり、それがSunOS 5向けです。 後のPOSIXドラフトには「socklen_t *」があり、Single Unix Specificationおよびglibc2も同様です。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

|  

[cols="^",]

|Advertisements