« 2010年4月25日 - 2010年5月1日 | トップページ | 2010年5月16日 - 2010年5月22日 »

2010年5月 2日 (日)

ソケットのread、writeのタイムアウト

以下、先週のお勉強メモです。

今、ある製造装置の制御、計測を行うプログラムを作ってます。
機器との通信には、ソケット(いわゆるTCP/IPですな)を使って
います。
さて、例えば、あるリクエストを送り、その応答を待つ場合、

   while ( read( fd, buffer, count) > 0 ){
       ...........
   }

のようなwhile文を使っているのですが、何せ相手はやや下等な
ファームウェアの機器ですから、何かの理由で応答が返ってこな
いことがあります。極端な場合、誰かが機器の電源を切ってしまっ
ている可能性もあるのです。そのような場合、whileのところで
ずーっと待ち続けることになります。ある程度の時間応答がなけ
れば、エラーを返してくれると良いのですが...。

このような場合、下のようにソケットオプションでタイムアウトを設
定すれば、セットした時間後にタイムアウトしてreadがエラーを返し
てくれるようになります。

  struct timeval tv;

  tv.tv_sec = COMM_TIMEOUT;
  tv.tv_usec = 0;
  setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));

COMM_TIMEOUTは秒数で指定します。
writeでタイムアウトを設定する場合は、

  setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv))

とします。

以上、先週のお勉強でした。

| | コメント (2) | トラックバック (0)

« 2010年4月25日 - 2010年5月1日 | トップページ | 2010年5月16日 - 2010年5月22日 »