ソケットの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))
とします。
以上、先週のお勉強でした。
| 固定リンク
コメント
こんばんわ♪
制御系は相手がほとんどシーケンサが多いからタイムアウトか、ユーザーからの割り込み信号で対応ですかな^^;;
投稿: tukkyだんな | 2010年5月 2日 (日) 20時24分
コメントありがとうございます。私の場合、商売でやっているわけではないのですが、プロのプログラマの方々には、きっとこういうの常識なんでしょうねえ。
投稿: tearoller | 2010年5月 3日 (月) 10時15分