ソケットはプロセス間通信 (IPC:Inter Process Communication) の一種で、ネットワークで接続された異なるコンピュータ上のプロセスと通信できます。socketを使ったC言語のプログラミング方法をご紹介します。
ソケットには次の2種類がある。
ソケット | 通信プロトコル |
---|---|
ストリーム型 | TCP |
データグラム型 | UDP |
SOCK_STREAM型を指定したソケットを利用する、ストリーム指向のクライアント/サーバー通信は、データグラム指向の通信よりもやや複雑です。複雑ではありますが、信頼性の高い通信経路を提供します。
SOCK_STREAM型ソケットを使用した、クライアント/サーバー処理の流れを次に示します。
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;
}
SOCK_DGRAM型のソケットを使ったデータグラム指向のクライアント/サーバー通信は、ストリーム指向の通信より単純です。簡単ではありますが、信頼性は低いです。
サーバーは、クライアントからの接続を受容(accept)するために聴取(listen)を行う必要はなく、クライアントはサーバーに接続(connect)する必要がありません。
SOCK_DGRAM型ソケットを使用した、クライアント/サーバー処理の流れを次に示します。
W. Richard Stevens, Stephen A. Rago (2014) 詳解UNIXプログラミング