Hitsuji_monのブログ~ 村上春樹のあれ ~

文学好きな組み込み系エンジニア

【#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アドレスを文字列で取り出すこともできる。

baconbacon.blog42.fc2.com

struct sockaddrのキャスト
developer.wonderpla.net


システムコールの中身を説明
qiita.com

ubuntuでのソケット関連のライブラリファイルの場所

_SOCKADDR_COMMON_ 関連

pgameprojects.blog-sim.com

www.coins.tsukuba.ac.jp

_SOCKADDR_COMMON はプリプロセッサであるとの説明
qiita.com

マクロであるとの説明
bttb.s1.valueserver.jp


Ubuntuにおけるライブラリファイルの場所

  • in.h の場所

/usr/include/netinet/in.h

  • /bits の場所

/usr/include/x86_64-linux-gnu

  • /sys/socket.hの場所

/usr/include/x86_64-linux-gnu/sys/socket.h

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アドレスに変更する事になります。

dbweb.0258.net


teratail.com