私はタイマーに関連して尋ねられたさまざまな質問を経験しました。そして、それは私のコードが機能するはずです。ただし、ソケットでデータを受信しているときにタイムアウトが発生した場合は機能しません。私はtimeout_timerという関数を作成し、その関数の定義を次のようにしています。
timeout_timer(long seconds, long micro_seconds)
{
struct itimerval *alarm_set;
if (micro_seconds >= MILLION) {
seconds = seconds + micro_seconds / MILLION;
micro_seconds = micro_seconds % MILLION;
}
alarm_set = malloc(sizeof (struct itimerval));
alarm_set->it_value.tv_sec = seconds;
alarm_set->it_value.tv_usec = micro_seconds;
alarm_set->it_interval.tv_sec = (seconds == 0 && micro_seconds == 0) ? 0 : 2;
alarm_set->it_interval.tv_usec = 0;
if (setitimer(ITIMER_REAL, alarm_set, (struct itimerval *) NULL) == -1) {
pause();
}
free(alarm_set);
}
このtimeout_timer関数を次のように呼び出しました。
timeout_timer(3,0);
memset(rcv_msg,0x0, MAX_MSG);
if ((n = recv(sd, rcv_msg, MAX_MSG, 0)) <= 0)
{
timeout_timer(0,0);
close(sd);
break;
}
else
{
timeout_timer(0,0);
trim_space(rcv_msg);
}
タイムアウト制限内でデータを受信した場合は正常に動作します。しかし、タイマーが切れるとき、それは立ち往生しました。私がそれを理解するのを手伝ってください。