[ C++で開発 ]

ソケットプログラミング

C++でも、ネットワーク通信のライブラリが各種揃ってきている昨今、いまさらソケットAPIを使用したネットワークプログラミングをする機会は少ないかもしれません。

しかし、ネットワーク通信の基盤であるソケットAPIとその動きを知っていないと、いざ問題があった場合に対応できません。また、高度なネットワーク処理を行いたい場合に、ライブラリにない機能を使って解決できる必要もあるでしょう。

ソケットアドレス

TCP

UDP

ICMP

RAW

Tips集

ソケットからのデータ受信

recvで受信タイムアウトを行いたい

ソケットからデータを受信するときに使用する代表的なAPIが、recvです。通常recv呼び出しはデータが受信するまでブロックします。ここで、ある一定時間データが受信しない場合、ブロックを解除してエラー処理等を行いたいとします。

それには、以下のプログラミング方針が考えられます。

  1. ソケットオプション SO_RCVTIMEO を使用する
  2. select/poll/epollといった APIを使用する

SO_RCVTIMEOは、OSによってサポートされていないこともあります。

SO_RCVTIMEOサポート状況
OS 対応 備考
Linux カーネル2.3.41以降
Windows WinSock 2の実装
Solaris Solaris 10時点で未対応

使い分けは、1つのソケット受信ブロックだけ対処すればよいなら簡単な1.

アドレスの取得

ソケットの両端のアドレスを取得したい

ソケットのアドレスは、