【#100DaysOfCode】補講: ソケットプログラミング sockaddr構造体など
C言語によるソケットプログラミングの参考ページをまとめておく
ソケットプログラミング: TCP通信
ソケットプログラミングの位置付け
何でもかんでもSocketを使うな
anopara.net
システムコール関数の仕様
IBM社のPDFを参照
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_73/rzab6/rzab6pdf.pdf
Socket構造体
d.hatena.ne.jp
sockaddr構造体とsockaddr_in構造体
- BSDにおいてsockaddr構造体は以下のように宣言される.
参照場所は、/usr/include/sys/socket.h
struct sockaddr{ unsigned char sa_len; //8ビット:この構造体の長さを格納 sa_family_t sa_family; //8ビット:アドレスファミリの種類を「数値」として格納 char sa_data[14]; //アドレスデータを格納 };
- sa_family_t型は、/usr/include/netinet/in.hで以下のように定義される.
typedef unsigned short sa_family_t 単に8ビットの変数やんけ。よく見かけるAF_INETとかが格納される。
- でsockaddr_in構造体は、/usr/include/netinet/in.hにあって以下のように記述されている
struct sockaddr_in { uint8_t sin_len; //8ビット:上のものと同じ sa_family_t sin_family; //8ビット:上のものと同じ in_port_t sin_port; //16ビット:ポート番号を格納 struct in_addr sin_addr; //32ビット:IPアドレスを格納 char sin_zero[8]; //未使用 }; n_port_t型=uint16_t型=unsigned short型だと思われる。要するに16ビットらしい
- メンバの中にin_addr構造体があるが、これは同ファイルで以下のように記述されている。
struct in_addr { in_addr_t s_addr; }; in_addr_t型 = __uint32_t = unsigned int型ぽい。要するに32ビット。 ほげほげ.sin_addr.s_addr = inet_addr( IPアドレス)の形で文字列のIPアドレスを適切な形にして格納する。 char *IP = inet_ntoa(ほげほげ.sin_addr.sin_addr)の形でデータとしてのIPアドレスを文字列で取り出すこともできる。
struct sockaddrのキャスト
developer.wonderpla.net
ubuntuでのソケット関連のライブラリファイルの場所
_SOCKADDR_COMMON_ 関連
_SOCKADDR_COMMON はプリプロセッサであるとの説明
qiita.com
マクロであるとの説明
bttb.s1.valueserver.jp
Ubuntuにおけるライブラリファイルの場所
- in.h の場所
/usr/include/netinet/in.h
- /bits の場所
- /sys/socket.hの場所
/usr/include/x86_64-linux-gnu/sys/socket.h
- 127.0.0.1 とは何か?
Raspberry Piのホストファイル /etc/hosts に記述があった
ファイルの場所: /etc/hosts 127.0.1.1 raspberrypi Ubuntu10.04(12.04も同様)のServer(サーバー)版でIPアドレスを固定に変更しホスト名も変更しようと言うことで設定をしていると、ホスト名の部分のIPアドレスとして、「127.0.1.1」が設定されているのが分かった。ネットで調べるとこれは、インストール時に自動的にIPアドレスを取得した場合(DHCPを利用)に、このように設定されれるDebian系のディストリビューションの仕様という事でした。Ubuntu10.04.2のServer版でIPアドレスを固定と自動取得とインストールして動作を確認して、Webの情報と比較して納得。 したがって、IPアドレスの設定をDHCPによる取得から固定アドレスに変更する場合は、/etc/hostsの設定については、127.0.1.1の部分を設定するIPアドレスに変更する事になります。