9.3 connect()

サーバにソケットを接続します。

9.3.1 書式

#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *serv_addr,
            socklen_t addrlen);

9.3.2 解説

socket() コールでソケット記述子を構築したら、connect() システムコールを使って、そのソケットをリモートサーバに接続することができます。必要なことは、ソケット記述子と、もっとよく知りたいと思うサーバのアドレスを渡すだけです。(それと、このような関数によく渡されるアドレスの長さも。)

通常、この情報は getaddrinfo() を呼び出した結果として得られますが、必要であれば自分自身で struct sockaddr を埋めることもできます。

ソケット記述子の bind() をまだ呼んでいない場合、ソケットは自動的にあなたの IP アドレスとランダムなローカルポートに束縛されます。サーバでない場合は、ローカルポートを気にする必要はなく、リモートポートを気にして serv_addr パラメータに設定するだけなので、通常はこれで十分です。クライアントソケットを特定の IP アドレスとポートにしたい場合は、bind() を呼び出すことができますが、これはかなりまれなケースです。

ソケットを connect() したら、あとは自由に send()recv() をして、好きなだけデータを取り込めます。

特記事項:SOCK_DGRAM UDP ソケットをリモートホストに connect() した場合、send()recv() だけでなく、sendto()recvfrom() も使用できるようになります。もし必要なら。

9.3.3 返り値

成功した場合は 0 を、エラーの場合は -1 を返す(それに応じて errno が設定されます)。

9.3.4 例

// connect to www.example.com port 80 (http)

struct addrinfo hints, *res;
int sockfd;

// first, load up address structs with getaddrinfo():

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;

// we could put "80" instead on "http" on the next line:
getaddrinfo("www.example.com", "http", &hints, &res);

// make a socket:

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

// connect it to the address and port we passed in to getaddrinfo():

connect(sockfd, res->ai_addr, res->ai_addrlen);

9.3.5 参照

socket(), bind()