HTTP Client の動作フロー その4 : connect() でサーバに接続する

connect()の書式 | connect(2)

#include <sys/types.h> /* 移植性が必要な場合 */
#include <sys/socket.h>

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

connect() システムコールは、ファイルディスクリプタ sockfd が参照しているソケットを addr で指定されたアドレスに接続する。 addrlen 引き数は addr の大きさを示す。 addr のアドレスのフォーマットはソケット sockfd のアドレス空間により異なる。 さらなる詳細は socket(2) を参照のこと。

接続または対応づけに成功するとゼロを返す。 失敗すると -1 を返し、 errno に適切な値を設定する。

TCP/IPの場合の addr フォーマット | ip(7)

struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};
  • sin_familiy には常に AF_INET をセットする。
  • sin_port にはポート番号をネットワークバイトオーダーで指定する。
  • sin_addr は IP ホストアドレスである
    • struct in_addr の s_addr メンバには、ホストのインターフェースアドレスを ネットワークバイトオーダーで指定する
    • in_addrは下記のいずれかで設定する
      • INADDR_* の一つ (例えば INADDR_ANY)
      • ライブラリ関数 inet_aton(3), inet_addr(3), inet_makeaddr(3) を用いる
      • 名前解決機構 (name resolver) を直接用いる(getaddrinfo(3)等)

ネットワークバイトオーダーって??

i386 ではホストバイトオーダは Least Significant Byte (LSB) first (リトルエンディアン) だが、 インターネットで使われるネットワークバイトオーダは Most Significant Byte (MSB) first (ビッグエンディアン) である

http://archive.linux.or.jp/JM/html/LDP_man-pages/man3/inet.3.html

ポート番号をネットワークバイトオーダーに変換する方法

htons()をつかって変換。

htons() 関数は unsigned short integer hostshort を ホストバイトオーダーからネットワークバイトオーダーに変換する。

ポート番号の範囲はunsigned short integer(16ビット符号無し整数)と定められているので、htons()をつかって変換する。

書式
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);

IPアドレスをネットワークバイトオーダーに変換する方法

inet_pton()関数を使う。(IPv4/IPv6対応)

書式
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

この関数は文字列 src を、アドレスファミリー af のネットワークアドレス構造体に変換し、 dst にコピーする。 af 引き数は AF_INET か AF_INET6 のどちらかでなければならない。