標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
#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() 呼び出しを 使用して事前にバインディングが完了していない場合)。次に、この呼び出しは別のソケットへの接続を試行します。
ストリーム・ソケットに関する 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 が示す バッファーのサイズ (バイト単位) です。
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 フィールドは使用されません。また、このフィールド は、すべてゼロに設定する必要があります。
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 にセットされる必要があります。
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 フィールドには、パス名の長さが含まれます。
正常に実行された場合、connect() は 0 を戻します。
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));