HTTP Client の動作フロー その3 : socket() でソケットを開く

socket()の書式

#include <sys/types.h> /* 移植性を考慮する際は必要 */ 
#include <sys/socket.h>
int socket(int domain, int type, int protocol); 

socket() は通信のための端点(endpoint)を作成し、ディスクリプター(descriptor)を返す。

成功した場合、新しいソケットのファイル・ディスクリプターを返す。 エラーが発生した場合は -1 を返し、 errno を適切に設定する。

プロトコル・ファミリ

引数のdomainドメイン名のことではなく、通信で使用したいプロトコル・ファミリ(protocol family)のこと。

主なプロトコルファミリ

ソケットのタイプ

typeには、通信方式(semantics)を指定する。

おもなタイプ
  • SOCK_STREAM
    • 順序性と信頼性があり、双方向の、接続された バイト・ストリーム(byte stream)を提供する。
    • IPだとTCP
  • SOCK_DGRAM
    • データグラム(接続、信頼性無し、固定最大長メッセージ) をサポートする。
    • IPだとUDP

プロトコル

protocol はソケットによって使用される固有のプロトコルを指定する。通常それぞれの ソケットは、与えられたプロトコル・ファミリの種類ごとに一つのプロトコルのみを サポートする。 その場合は protocol に 0 を指定できる。

プロトコル・ファミリ/タイプ/プロトコル 対応表

僕の理解ではこんな感じ。

プロトコル・ファミリ タイプ プロトコル 使用されるプロトコル
AF_INET SOCK_STREAM 0 TCP/IP
AF_INET SOCK_DGRAM 0 UDP/IP

IPv4TCP/IP通信をしたいとき
int sfd = socket(AF_INET, SOCK_STREAM, 0);
IPv4UDP/IP通信をしたいとき
int sfd = socket(AF_INET, SOCK_DGRAM, 0);

ソケットの閉じ方

close(sfd); //sfdはsoket()が返したファイル・ディスクリプター

疑問

というか、ソケットってそもそもなんだ??
明日調べてみることにする。