CONNECT
Section: Linux Programmer's Manual (2)
Updated: 2004-06-23
Index
JM Home Page
roff page
名前
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(7)
も参照のこと)
- 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 で最初に登場した), 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)
も参照のこと。
バグ
AF_UNSPEC
アドレスを指定して
connect()
を呼ぶことによりソケットの接続を解消する機能はまだ実装されていない。
例
connect()
の利用例が
getaddrinfo(3)
に記載されている。
関連項目
accept(2),
bind(2),
getsockname(2),
listen(2),
socket(2),
path_resolution(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 注意
-
- バグ
-
- 例
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:35 GMT, November 19, 2007