C言語-ソケットプログラミング_ソケットとは

ソケット(socket)とは

ソケットプログラミングにおけるソケットとは

ソケットとは、アプリケーションがデータを送受信するための仕組みを抽象化したものです。

ソフトウェア開発者は、ソケットの仕組みに則ってプログラムを記述すれば、具体的な通信手段や手順の詳細を知らなくても、通信を行うことができます。

ネットワークプログラミングはソケットというAPI(Application Programming Interface)を利用して記述します。


TCPソケットとは

TCP/IPネットワークを通じて、別のコンピュータ上で実行されているプログラムと通信を行なう仕組みです。

ネットワークソケットとも呼ばれますが、IT業界でソケットと行った場合には、このTCPソケットを指すことがほとんどです。


UNIXドメインソケット(UNIX domain socket)とは

同一コンピュータ上で、異なるプログラム(実行中のプロセス)間でデータを送受信する仕組みです。

プロセス間通信(IPC:Inter-Process Communication)で用いられることから「IPCソケット」とも呼ばれるます。


一般社会におけるソケットとは

ソケットとは、受け口、軸受け、接合部などの意味を持つ英単語です。

一般的にはソケットという言葉から「電球の受け口の金具」を連想することが多いです。


ソケット・ディスクリプタ

ディスクリプタ(descriptor)とは

ディスクリプタとは、ストリームを区別する識別子として使う固有の番号のことです。

ディスクリプタはプロセスごとの固有の値であり、例えば、0番が標準入力、1番が標準出力、2番が標準エラー出力となります。

ファイル・ディスクリプタ(file descriptor)が対応しているストリームをローカルのファイルに接続することで、ファイルへの読み書きが行えます。


ソケット・ディスクリプタ(socket descriptor)とは

ソケットプログラミングにおけるソケットとは、ネットワーク通信に用いるファイル・ディスクリプタを意味します。

ファイル・ディスクリプタが対応しているストリームの接続先をネットワーク経由の接続先ファイルにするイメージです。

これにより、ネットワーク通信をローカルファイルへの読み書きと全く同じように用いることが可能になります。


ソケットの作成

socket()関数

アプリケーションプログラムがTCP/UDPを使用してネットワーク通信を行う場合には、ソケットの作成をOSに依頼します。

socket()関数により「ソケットディスクリプタ」を生成し、ソケットAPIで処理されるソケット識別子として使用します。


#include<sys/types.h>
#include<sys/socket.h>

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

domain

プロトコルファミリを指定します。

AF_INET インターネット(INET)ドメインの2ホスト間プロセス通信(UNIXネットワークソケット)。
AF_UNIX UNIXドメインの1ホスト内プロセス通信。ファイルシステムソケット。
AF_ISO ISO標準プロトコル
AF_NS Xerox Network Systemsプロトコル

type

通信の種類を定義します。

SOCK_STREAM 順次双方向バイトストリーム。コネクション型の信頼性が高い通信となります。
SOCK_DGRAM データグラム。ベストエフォート型の通信となります。
SOCK_ROW 直接IPを用いた通信を行なう

protocol

エンドツーエンドプロトコルを指定します。

0 自動設定(AF_INET&SOCK_RAWでIPを直接扱いたい場合も含む)
IPPROTO_TCP TCP/IP(AF_INET&SOCK_STREAMの場合。0も可。)
IPPROTO_UDP UDP/IP(AF_INET&SOCK_DGRAMの場合。0も可。)
IPPROTO_RAW ICMP

戻り値

整数(ソケット記述子) 成功
-1 失敗

アドレスの指定

ソケットを使用するアプリケーションでは、IPアドレスとポート番号をOSカーネルに知らせる必要があります。

ソケットAPIではソケットに関連付けしたアドレスを指定するために、「sockaddr」という汎用のデータ型が定義されています。

プロトコルごとにsockaddrデータ型にキャストできるデータ構造を再定義することで、ソケットの汎用性を持たせています。

例えば、TCP/IPソケットアドレスでは「sockaddr_in」構造体を利用しますが、これはsockaddr構造体をTCP/IPソケットアドレス用の形式に定義し直したものがとなります。


struct sockaddr {
    unsigned short sa_family; /* アドレスファミリー */
    char sa_data[14];         /* アドレス情報 */
};

ソケットの破棄

ソケットディスクリプタをclose()します。


int close( int socket );

ソケットオプション

getsockopt()とsetsockopt()でソケット動作を決める特性を調整することができます。

詳細は各システムのマニュアルを参照すること。



関連ページ


UDP通信


TCP通信