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);