◆ソケットの生成

#include <sys/socket.h>

 

int socket (int domain, int type, int protocol);

  •  成功時 ファイルディスクリプタ, 失敗時 -1 返還

domain :ソケットが使用するプロトコル情報

type :ソケットのデータ転送方式の情報

protocol :パソコン間通信に使用するプロトコル情報

 

domain

名前

プロトコルシステム

PF_INET

IPv4システム

PF_INET6

IPv6システム

PF_LOCAL

ローカル通信のためのUNIXプロトコルシステム

PF_PACKET

Low Levelソケットのためのプロトコルシステム

PF_IPX

IPXノベル?プロトコルシステム

type

SOCK_STREAM

接続指向ソケット

SOCK_DGRAM

非接続指向ソケット

TCPソケット=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
UDPソケット=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
 
◆住所情報の表現

struct sockaddr_in

{

sa_family_t        sin_family;  //住所システム(Address Family)

uint16_t             sin_port;     //16ビット TCP/UDP PORT番号

struct in_addr    sin_addr;   //32ビット IP住所

char                   sin_zero[8] //使われてない   

};

そして、上記構造体定義に使われてる、構造体in_addrは下記のように定義されている。
これは32ビット住所情報を入れられるように定義されている。

struct in_addr

{

in_addr_t    s_addr;   //32ビット IPv4インターネット住所

};

 
メンバー sin_family

Address Family

意味

AF_INET

AF_INET6

AF_LOCAL

IPv4インターネットプロトコルに適用する住所システム

IPv6インターネットプロトコルに適用する住所システム

ローカル通信のためのUNIXプロトコルの住所システム

 
メンバーsin_port

16ビットPORT番号をセーブする(ネットワークバイト順)

 

メンバーsin_addr

32ビットIP住所情報をセーブする(同じくネットワークバイト順)

 

バイト順番の変換(Endian Conversions)

sockaddr_in構造体変数に値を入れる前にネットワークバイト順番に変換するので、バイト順番の変換を手伝ってくれる関数の一覧

-unsigned short htons(unsogned short);

-unsigned short ntohs(unsigned short);

-unsigned long htonl(unsigned long);

-unsigned long ntohl(unsigned long);

hはホスト、nはネットワーク、sはshort、lはlong

 

INADDR_ANY

サーバソケットの生成中サーバのIP住所を入力するのは面倒くさいから次のように初期化すれば良い

struct sockaddr_in addr;

char *serv_port = "9190";

memset(&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = htonl(INADDR_ANY);

addr.sin_port = htons(atoi(serv_port));