5.4 connect()---やあ、こんにちは!

ちょっとだけ、あなたが telnet アプリケーションであることを仮定してみましょう。ユーザが(映画 TRON のように)ソケットファイル記述子を取得するように命令します。あなたはそれに応じ、socket() を呼び出します。次に、ユーザはポート "23"(標準的な telnet ポート)で "10.12.110.57" に接続するように指示します。やったー!どうするんだ?

幸運なことに、あなたは今、connect() の章---リモートホストに接続する方法を読んでいるところです。だから、猛烈に読み進めましょう!時間がない!

connect() の書式は以下の通りです。

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

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

sockfdsocket() コールで返される、我々の身近なソケットファイル記述子、serv_addr は宛先ポートと IP アドレスを含む struct sockaddraddrlen はサーバアドレス構造体のバイト長です。

これらの情報はすべて、getaddrinfo() の呼び出しの結果から得ることができ、これはロックします。

だんだん分かってきたかな?ここからは聞こえないので、そうであることを祈るしかないですね。ポート 3490 の "www.example.com" にソケット接続する例を見てみましょう。

struct addrinfo hints, *res;
int sockfd;

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

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

getaddrinfo("www.example.com", "3490", &hints, &res);

// make a socket:

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

// connect!

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

繰り返しになりますが、古いタイプのプログラムでは、独自の struct sockaddr_ins を作成して connect() に渡していました。必要であれば、そうすることができます。上の bind()の章 で同様のことを書いています。

connect() の戻り値を必ず確認してください。エラー時に -1 が返され、errno という変数がセットされます。

また、bind() を呼んでいないことに注意してください。基本的に、私たちはローカルのポート番号には関心がありません。カーネルは私たちのためにローカルポートを選択し、接続先のサイトは自動的にこの情報を取得します。心配はいりません。