Unix-system-calls-accept
[top]#
|http://www.google.com/[Google] | a|
Web | This Site |
選択した読書
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); |
説明
引数_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のみです。
ノート
返り値
成功すると、 accept ()は、受け入れられたソケットの記述子である負でない整数を返します。 エラーの場合、-1が返され、_errno_が適切に設定されます。
エラー処理
Linux accept ()は、新しいソケットで保留中のネットワークエラーを accept ()からのエラーコードとして渡します。 この動作は、他のBSDソケット実装とは異なります。 信頼性のある動作のために、アプリケーションは、 accept ()の後にプロトコルに定義されたネットワークエラーを検出し、再試行することで EAGAIN のように扱う必要があります。 TCP/IPの場合、これらは ENETDOWN 、 EPROTO 、 ENOPROTOOPT 、 EHOSTDOWN 、 ENONET 、 EHOSTUNREACH 、 EOPNOTSUPP 、および ENETUNREACH です。
エラー
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. |
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カーネルは、 ENOSR 、 ESOCKTNOSUPPORT 、 EPROTONOSUPPORT 、 ETIMEDOUT などの他のエラーを返す可能性があります。 値 ERESTARTSYS は、トレース中に表示される場合があります。
準拠
SVr4、4.4BSD( accept ()は4.2BSDで初めて登場しました)。
NOTE
関連項目
[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]
広告
|
[cols="^",] |
|Advertisements