connect() - ソケットの接続

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

X/Open:
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

int connect(int socket, const struct sockaddr *address, socklen_t address_len);
バークレー・ソケット:
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

int connect(int socket, struct sockaddr *address, int address_len);

機能説明

ストリーム・ソケットの場合、connect() 呼び出し は 2 つのソケット間の接続を確立しようとします。データグラム・ソケットの場合、connect() 呼び出し はソケットのピアを指定します。socket パラメーターは、接続要求の発信に 使用されるソケットです。connect() 呼び出しは、ストリーム・ソケット用に 呼び出されたときに、2 つのタスクを実行します。まず、この呼び出しはストリーム・ソケットに必要な バインディングを完了します (bind() 呼び出しを 使用して事前にバインディングが完了していない場合)。次に、この呼び出しは別のソケットへの接続を試行します。

注: X/Open ソケット関数の 場合、socket 記述は socket に 、addressaddress に、そして address_lenaddress_len に 適用されます。conststruct sockaddr に 追加されます。
パラメーター
説明
socket
ソケット記述子。
address
接続の試行先のソケット・アドレスを含む ソケット・アドレス構造体を指すポインター。
address_len
address が指すソケット・アドレスの サイズ (バイト単位)。

ストリーム・ソケットに関する connect() 呼び出し は、サーバーへの接続を確立するため、クライアント・アプリケーションで使用します。サーバーには、受動のオープン保留が必要です。ソケットを使用しているサーバーは、サーバー が accept() を使用して接続を受け入れられるように なる前に、bind() および listen() を 正常に呼び出しておかなければなりません。そうしないと、connect() が -1 を戻して、エラー・コードが ECONNREFUSED に設定されます。

socket がブロック・モードの 場合、connect() 呼び出しは、接続が セットアップされるまで、あるいはエラーが受信されるまで、呼び出し元をブロックします。socket が非ブロック・モードの場合、connect は、 戻りコードは -1、errno は EINPROGRESS ですぐに戻ります。呼び出し元は、select() を呼び出して、ソケット への書き込みができるかどうかをテストすることによって、接続セットアップの完了をテストすることができます。

データグラム・ソケット用に呼び出される と、connect() はこのソケットが関連している ピアを指定します。これにより、アプリケーションは接続状態にあるソケット 用に予約されたデータ転送呼び出しを使うことができます。この場合、sendto()、 recvfrom()、sendmsg()、および recvmsg() 呼び出しに加えて、read()、write()、 readv()、writev()、send()、および recv() 呼び出し が使用できるようになります。ストリーム・ソケットは connect() を一度しか 呼び出せませんが、データグラム・ソケットはソケットの 関連を変更するのに、何度も connect() を呼び出す ことができます。データグラム・ソケットは、NULL アドレス (全フィールドが ゼロ) などの間違ったアドレスに接続することによって、ソケットの関連を解消することができます。

address パラメーターは、アプリケーションが 接続する必要のあるピアの名前を含むバッファーを指す ポインターです。address_len パラメーターは、address が示す バッファーのサイズ (バイト単位) です。

AF_INET ドメインのサーバー: サーバーが AF_INET ドメインにある場合、名前バッファーの形式は、組み込みファイルの netinet/in.h に定義されている ように、sockaddr_in であると予期されます。
struct in_addr
{
        ip_addr_t s_addr;
};

 struct sockaddr_in {
     unsigned char  sin_len;
     unsigned char  sin_family;
     unsigned short sin_port;
     struct in_addr sin_addr;
     unsigned char  sin_zero[8];

};

sin_family フィールドは、AF_INET に設定する必要があります。sin_port フィールドは、サーバーの結合先であるポートに 設定します。このフィールドは、ネットワーク・バイト順に指定しなければ なりません。sin_zero フィールドは使用されません。また、このフィールド は、すべてゼロに設定する必要があります。

AF_INET6 ドメインのサーバー: サーバーが AF_INET6 ドメインにある場合、名前バッファーの形式は、 netinet/in.h に定義されているように、sockaddr_in6 であると想定されます。
 struct sockaddr_in6 {
     uint8_t char    sin6_len;
     sa_family_t     sin6_family;
     in_port_t       sin6_port;
     uint32_t        sin6_flowinfo;
     struct in6_addr sin6_addr;
     uint32_t        sin6_scope_id;
];

sin6_ ファミリー は、AF_INET6 にセットされる必要があります。

AF_UNIX ドメインのサーバー: サーバーが AF_UNIX ドメインにある場合、名前バッファーの形式は、組み込みファイルの un.h に定義されているように、sockaddr_un であると予期されます。
 struct sockaddr_un {
    unsigned char  sun_len;
    unsigned char  sun_family;
             char  sun_path[108];        /* path name */
};

sun_family フィールドは、AF_UNIX に設定します。sun_path フィールドには、NULL 終了のパス名が 含まれ、sun_len フィールドには、パス名の長さが含まれます。

C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。
注: connect() 関数は、拡張 ASCII の拡張機能のレベルに依存します。詳細は、拡張 ASCII サポートを参照してください。

戻り値

正常に実行された場合、connect() は 0 を戻します。

正常に実行されなかった場合、connect() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EADDRNOTAVAIL
指定のアドレスは、ローカル・マシンからは 利用できません。
EAFNOSUPPORT
アドレス・ファミリーがサポートされません。
EALREADY
socket ソケット記述子が非ブロックであると マークされ、直前の接続の試行が完了していません。
EBADF
socket パラメーターが無効ソケット記述子です。
ECONNREFUSED
接続要求が宛先ホストによりリジェクトされました。
EFAULT
addressaddress_len を使用した結果、呼び出し元のアドレス・スペース内のデータを書き込むことができない部分にアドレスをコピーすることになります。
EINTR
接続を確立しようとしたが、受信されたシグナルの デリバリーにより割り込まれました。その接続は非同期的に確立されます。
EINVAL
address_len パラメーターが有効な長さではありません。
EIO
ネットワーク障害またはトランスポート障害が発生しています。
EISCONN
socket ソケット記述子が既に接続済みです。
ENETUNREACH
このホストからネットワークに到達することができません。
ENOTSOCK
記述子は、ソケットではなくファイルを参照します。
EOPNOTSUPP
socket パラメーターが SOCK_STREAM 型ではありません。
EPERM
connect() の呼び出し元がユーザーの ID を取り出そうとしていた ときに、この呼び出し元のプロセスがサーバーであることが検証されませんでした。サーバーであることが検証されるために、呼び出し元のプロセスに BPX.SERVER プロファイルに対する許可がなければなりません (許可がないと、スーパーユーザーと BPX.SERVER は未定義になります)。また、呼び出し元のプロセスは、connect() を呼び出して ID を伝搬する前に、__passwd() または pthread_security_np() のどちらかを既に呼び出している必要があります。
EPROTOTYPE
プロトコルのタイプが、このソケットには適切ではありません。
ETIMEDOUT
接続が行われる前に、接続の確立がタイムアウトとなりました。
以下は、AF_UNIX 専用です。
エラー・コード
説明
EACCES
パス接頭部のコンポーネントに対する検索許可が拒否されているか、あるいは名前付きソケットへの書き込みアクセスが拒否されています。
EIO
ファイル・システムの読み取り中または書き込み中に、入出力エラーが発生しました。
ELOOP
address のパス名の変換中に検出された シンボリック・リンクが多すぎます。
ENAMETOOLONG
パス名のコンポーネントが NAME_MAX 文字を超えたか、あるいはパス名全体が PATH_MAX 文字を超えました。
ENOENT
パス名のコンポーネントに既存のファイル名が指定されていないか、またはパス名が空ストリングです。
ENOTDIR
address のパス名のパス接頭部のコンポーネントが ディレクトリーではありません。

以下に示すのは、connect() 呼び出しの例です。 IP アドレスとポートは、ネットワーク・バイト順 でなければなりません。ポートをネットワーク・バイト順にする には、htons() ユーティリティー・ルーチンを 呼び出して、ホスト・バイト順からネットワーク・バイト順 に短整数を変換します。address フィールドは、別のユーティリティー・ ルーチン inet_addr() を使用して設定します。このルーチン は、インターフェースの小数点付き 10 進数アドレスを表す文字ストリングを 受け取って、2 進の IP アドレス表記をネットワーク・バイト順 に戻します。最後に、要求された名前が予約済みフィールドを何も設定しない ようにするため、構造体を使用する前に構造体をゼロに することをお勧めします。以下の例は、bind() - ソケットへの名前の結合呼び出しの記載例に 示してあるサーバーへの接続に使用できます。
int s;
struct sockaddr_in inet_server;
struct sockaddr_un unix_server;
int rc;
int connect(int s, struct sockaddr *name, int namelen);

/* Connect to server bound to a specific interface in the 
Internet domain */
/* make sure the sin_zero field is cleared */
memset(&inet_server, 0, sizeof(inet_server));
inet_server.sin_family = AF_INET;
inet_server.sin_addr.s_addr = inet_addr("129.5.24.1"); 
/* specific interface */
inet_server.sin_port = htons(1024);
⋮
rc = connect(s, (struct sockaddr *) &inet_server, 
sizeof(inet_server));

/* Connect to a server bound to a name in the UNIX domain */
/* make sure the sunix_addr, sunix_port, sunix_nodeid fields are cleared
*/
memset(&unix_server, 0, sizeof(unix_server));
unix_server.sun_family = AF_UNIX;
strncpy(unix_server.sun_path, "mysocket");
unix_server.sun_len = sizeof(unix_server.sun_len);
strncpy(mvsservername.sunix_name, "APPL    ", 8);
⋮
rc = connect(s, (struct sockaddr *) 
&unix_server, sizeof(unix_server));

関連情報