ソケットに関するシステムコールとC言語プログラミング

ソケットはプロセス間通信 (IPC:Inter Process Communication) の一種で、ネットワークで接続された異なるコンピュータ上のプロセスと通信できます。socketを使ったC言語のプログラミング方法をご紹介します。

ソケットの種類

ソケットには次の2種類がある。

ソケットの種類
ソケット 通信プロトコル
ストリーム型 TCP
データグラム型 UDP

ストリームソケット (コネクション型、TCP/IP)

SOCK_STREAM型を指定したソケットを利用する、ストリーム指向のクライアント/サーバー通信は、データグラム指向の通信よりもやや複雑です。複雑ではありますが、信頼性の高い通信経路を提供します。

SOCK_STREAM型ソケットを使用した、クライアント/サーバー処理の流れを次に示します。

ストリームソケット
Figure 1. ストリームソケット

socket()関数は、ソケット(socket)と呼ばれる通信の端点を作り出します。

bind() でソケットに名称を付与します。

listen() でクライアントからの接続要求を受け付けます。

accept() でクライアントからの接続要求を待ち合わせます。接続要求を受信すると、新規ソケットを生成します。

connect() でサーバーに接続します。

指定ホストと通信可能で、指定ポート番号のソケットが開いていない場合、 connect()ECONNREFUSED でエラー終了します。

ホストと通信できない場合、一定の時間経過後に connect() はETIMEOUTでエラー終了します。Solarisの場合、タイムアウト時間は ndd コマンドで確認することができます。

$ ndd /dev/tcp tcp_ip_abort_cinterval
180000

値はミリ秒単位です。

send() または write() でデータの送信、 recv() または read() でデータを受信します。

close() で接続を切断します。

int main(void) {
  int fd;
  fd = socket(PF_INET, SOCK_STREAM, 0);
  if (fd < 0) {
    perror("socket error");
    return 1;
  }
  close(fd);
  return 0;
}

データグラムソケット (コネクションレス型、UDP/IP)

SOCK_DGRAM型のソケットを使ったデータグラム指向のクライアント/サーバー通信は、ストリーム指向の通信より単純です。簡単ではありますが、信頼性は低いです。

サーバーは、クライアントからの接続を受容(accept)するために聴取(listen)を行う必要はなく、クライアントはサーバーに接続(connect)する必要がありません。

SOCK_DGRAM型ソケットを使用した、クライアント/サーバー処理の流れを次に示します。

データグラムソケット
Figure 2. データグラムソケット

参考文献

W. Richard Stevens, Stephen A. Rago (2014) 詳解UNIXプログラミング