connect - システムコールの説明 - Linux コマンド集 一覧表
名前
connect - ソケットの接続を行う
書式
#include <sys/types.h>
#include <sys/socket.h>
int connect(int
sockfd
, const struct sockaddr *
serv_addr
,
socklen_t
addrlen
);
説明
connect
()システムコールは、ファイルディスクリプタ
sockfd
が参照しているソケットを
serv_addr
で指定されたアドレスに接続する。
addrlen
引き数は
serv_addr
の大きさを示す。
serv_addr
のアドレスのフォーマットはソケット
sockfd
のアドレス空間により異なる。
さらなる詳細は
socket
(2) を参照のこと。
ソケット
sockfd
が
SOCK_DGRAM
型であれば、
serv_addr
は、デフォルトのデータグラムの送信先のアドレスであり、
データグラムを受信する唯一のアドレスを示すに過ぎない。
ソケットが
SOCK_STREAM
型もしくは
SOCK_SEQPACKET
型であれば、このシステムコールは
serv_addr
で指定されたアドレスに結び付けられたソケットに対する接続の
作成を試みる。
一般的に、接続指向 (connection-oriented) プロトコルでは一度だけ connect ()が成功する。 非接続 (connectionless) プロトコルでは対応を変更するために何度も connect ()を使用できる。 非接続ソケットは sockaddr の sa_family メンバに AF_UNSPEC を設定することで、接続アドレスの対応を解消することができる。
返り値
接続または対応づけに成功するとゼロを返す。 失敗すると -1 を返し、 errno に適切な値を設定する。
エラー
以下は一般的なソケットについてのエラーである。他にドメイン特有のエラー が発生する可能性がある。
- EACCES
- Unix ドメインソケットはパス名で識別される。 ソケット・ファイルへの書き込み許可がなかったか、パス名へ 到達するまでのディレクトリのいずれかに対する検索許可がなかった。 ( path_resolution (2)も参照のこと)
- EACCES, EPERM
- ソケットのブロードキャスト・フラグが有効になっていないのに ユーザがブロードキャストへ接続を試みた。または、ローカルのファイアウォールの 規則により接続の要求が失敗した。
- EADDRINUSE
- ローカルアドレスが既に使用されている。
- EAFNOSUPPORT
- 渡されたアドレスの sa_family フィールドが正しいアドレス・ファミリーではない。
- EAGAIN
- 使用可能なローカルのポートがないか、 ルーティングキャッシュに十分なエントリがない。 PF_INET の場合に、どうやってローカルポートを増やすかに関しては ip (7) の net.ipv4.ip_local_port_range sysctl を参照のこと。
- EALREADY
- ソケットが非停止 (non-blocking) に設定されており、 前の接続が完了していない。
- EBADF
- ファイルディスクリプターがディスクリプターテーブルの 有効なインデックスではない。
- ECONNREFUSED
- リモートアドレスで接続を待っているプログラムがない。
- EFAULT
- ソケット構造体のアドレスがユーザーのアドレス空間外にある。
- EINPROGRESS
- ソケットが非停止 (non-blocking) に設定されていて、接続をすぐに 完了することができない。その場合、 select (2) や poll (2) を使ってそのソケットが書き込み可能になるのを待つことで、 接続の完了を知ることができる。 select (2) で書き込み可能になった後に、 getsockopt (2) を使って SOL_SOCKET レベルで SO_ERROR オプションを読み出すこ とにより、 connect ()が成功したか、失敗したかを判断できる。 成功の場合 SO_ERROR が 0 であり、 失敗の場合 SO_ERROR がここのリストにあるいずれかのエラーコードであり、 それにより失敗の原因が分かる。
- EINTR
- 捕捉されたシグナルによりシステムコールが中断された。
- EISCONN
- ソケットは既に接続 (connect) されている。
- ENETUNREACH
- 到達できないネットワークである。
- ENOTSOCK
- ファイルディスクリプターがソケットと関連付けられていない。
- ETIMEDOUT
- 接続を試みている途中で時間切れ (timeout) になった。サーバーが混雑していて 新たな接続を受け入れられないのかもしれない。 IP ソケットでは、 syncookie がサーバーで有効になっている場合、 タイムアウトが非常に長くなる場合があるので注意すること。
準拠
SVr4, 4.4BSD ( connect ()関数は 4.2BSD で最初に登場した)。
注意
connect ()の三番目の引き数は 4.x BSD や libc4, libc5 と同様に実際には int である。 POSIX では紆余曲折を経て現在の socklen_t になっており、 glibc でも socklen_t を使っている。 accept (2) も参照のこと。
バグ
AF_UNSPEC アドレスを指定して connect ()を呼ぶことによりソケットの接続を解消する機能はまだ実装されていない。