Provided by: manpages-ja-dev_0.5.0.0.20110915-1_all bug

名前

       connect - ソケットの接続を行う

書式

       #include <sys/types.h>          /* 「注意」参照 */
       #include <sys/socket.h>

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

説明

       connect() システムコールは、ファイルディスクリプタ sockfd が参照しているソケットを addr で
       指定されたアドレスに接続する。 addrlen 引き数は addr  の大きさを示す。  addr  のアドレスの
       フォーマットはソケット sockfd のアドレス空間により異なる。 さらなる詳細は socket(2) を参照
       のこと。

       ソケット sockfdSOCK_DGRAM 型であれば、 addr は、デフォルトのデータグラムの送信先のアド
       レスであり、 データグラムを受信する唯一のアドレスを示すに過ぎない。 ソケットが SOCK_STREAM
       型もしくは SOCK_SEQPACKET 型であれば、このシステムコールは addr で指定されたアドレスに結び
       付けられたソケットに対する接続の 作成を試みる。

       一般的に、接続指向  (connection-oriented) プロトコルでは一度だけ connect() が成功する。 非
       接続 (connectionless) プロトコルでは対応を変更するために何度も connect() を使用できる。 非
       接続ソケットは sockaddrsa_family メンバに AF_UNSPEC を設定することで、接続アドレスの対
       応を解消することができる (AF_UNSPEC はカーネル 2.2 以降の Linux でサポート)。

返り値

       接続または対応づけに成功するとゼロを返す。 失敗すると -1 を返し、 errno に適切な値を設定す
       る。

エラー

       以下は一般的なソケットについてのエラーである。他にドメイン特有のエラー  が発生する可能性が
       ある。

       EACCES UNIX ドメインソケットはパス名で識別される。  ソケット・ファイルへの書き込み許可がな
              かったか、パス名へ 到達するまでのディレクトリのいずれかに対する検索許可がなかった。
              (path_resolution(7) も参照のこと)

       EACCES, EPERM
              ソケットのブロードキャスト・フラグが有効になっていないのに ユーザがブロードキャスト
              へ接続を試みた。または、ローカルのファイアウォールの   規則により接続の要求が失敗し
              た。

       EADDRINUSE
              ローカルアドレスが既に使用されている。

       EAFNOSUPPORT
              渡されたアドレスの sa_family フィールドが正しいアドレス・ファミリーではない。

       EAGAIN 使用可能なローカルのポートがないか、 ルーティングキャッシュに十分なエントリがない。
              AF_INET      の場合に、ローカルポートの数を増やす方法については、      ip(7)     の
              /proc/sys/net/ipv4/ip_local_port_range の説明を参照のこと。

       EALREADY
              ソケットが非停止 (nonblocking) に設定されており、 前の接続が完了していない。

       EBADF  ファイルディスクリプターがディスクリプターテーブルの 有効なインデックスではない。

       ECONNREFUSED
              リモートアドレスで接続を待っているプログラムがない。

       EFAULT ソケット構造体のアドレスがユーザーのアドレス空間外にある。

       EINPROGRESS
              ソケットが非停止 (nonblocking) に設定されていて、接続をすぐに  完了することができな
              い。その場合、  select(2) や poll(2) を使ってそのソケットが書き込み可能になるのを待
              つことで、  接続の完了を知ることができる。  select(2)  で書き込み可能になった後に、
              getsockopt(2)  を使って  SOL_SOCKET レベルで SO_ERROR オプションを読み出すこ とによ
              り、 connect() が成功したか、失敗したかを判断できる。 成功の場合 SO_ERROR が 0 であ
              り、  失敗の場合 SO_ERROR がここのリストにあるいずれかのエラーコードであり、 それに
              より失敗の原因が分かる。

       EINTR  捕捉されたシグナルによりシステムコールが中断された。 signal(7) 参照。

       EISCONN
              ソケットは既に接続 (connect) されている。

       ENETUNREACH
              到達できないネットワークである。

       ENOTSOCK
              ファイルディスクリプターがソケットと関連付けられていない。

       ETIMEDOUT
              接続を試みている途中で時間切れ (timeout) になった。サーバーが混雑していて  新たな接
              続を受け入れられないのかもしれない。 IP ソケットでは、 syncookie がサーバーで有効に
              なっている場合、 タイムアウトが非常に長くなる場合があるので注意すること。

準拠

       SVr4, 4.4BSD, (connect() 関数は 4.2BSD で最初に登場した), POSIX.1-2001.

注意

       POSIX.1-2001 では <sys/types.h> のインクルードは必須とされておらず、 Linux  ではこのヘッダ
       ファイルは必要ではない。  しかし、歴史的には、いくつかの実装 (BSD 系) でこのヘッダファイル
       が 必要であり、移植性が必要なアプリケーションではこのファイルを インクルードするのが賢明で
       あろう。

       connect()  の三番目の引き数は  4.x BSD や libc4, libc5 と同様に実際には int である。 POSIX
       では紆余曲折を経て現在の socklen_t  になっており、  glibc  でも  socklen_t  を使っている。
       accept(2) も参照のこと。

       connect() の利用例が getaddrinfo(3) に記載されている。

関連項目

       accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7)