SIMPLE SOLUTIONS

CONNECT(2) - Linux manual

ソケットの接続を行う.

2014-09-06
CONNECT(2) Linux Programmer's Manual CONNECT(2)

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) を参照のこと。 ソケット 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_resolu‐ tion(7) も参照のこと) EACCES, EPERM ソケットのブロードキャストフラグが有効になっていないのに ユーザーがブロードキャストへ接続を試みた。または、ローカルのファイアウォールの 規則により接続の要求が失敗した。 EADDRINUSE ローカルアドレスが既に使用されている。 EADDRNOTAVAIL (インターネットドメインソケットの場合) sockfd が参照するソケットがそれ以前にアドレスにバインドされておらず、 そのソケットに一時ポートをバインドしようとした際に、 一時ポートとして使用する範囲のポート番号がすべて使用中であった。 ip(7) の /proc/sys/net/ipv4/ip_local_port_range の議論を参照のこと。 EAFNOSUPPORT 渡されたアドレスの sa_family フィールドが正しいアドレスファミリーではない。 EAGAIN ルーティングキャッシュにエントリーが十分にない。 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 ファイルディスクリプターがソケットと関連付けられていない。 EPROTOTYPE ソケットタイプが要求された通信プロトコルではサポートされていない。 このエラーは、 例えば UNIX ドメインデータグラムソケットをストリームソケットに接続しようとした場合などに起こり得る。 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() が失敗した場合、そのソケットの状態は不定だと考えること。 移植性を考慮したアプリケーションでは、そのソケットをクローズし、再接続用に新しいソケットを作成すべきである。

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

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

この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2014-09-06 CONNECT(2)
connect(2).txt (日本語 / Japanese)
Index English version of connect(2)
Go top