書式
#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) を参照のこと。ソケット sockfd が SOCK_DGRAM 型であれば、 addr は、デフォルトのデータグラムの送信先のアドレスであり、 データグラムを受信する唯一のアドレスを示すに過ぎない。 ソケットが SOCK_STREAM 型もしくは SOCK_SEQPACKET 型であれば、このシステムコールは addr で指定されたアドレスに結び付けられたソケットに対する接続の 作成を試みる。
一般的に、接続指向 (connection-oriented) プロトコルでは一度だけ connect() が成功する。 コネクションレス (connectionless) プロトコルでは対応を変更するために何度も connect() を使用できる。 非接続ソケットは sockaddr の sa_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) に記載されている。この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。