Halo,
On Thu, May 13, 2004 at 09:03:29PM +0700, iin wrote:
>
> Ada yang pernah membuat program C untuk timeout
> Maksudnya misal kita mengirim pesan ke kompi lain
> dalam selang waktu tertentu tidak jawaban dari kompi tersebut
> baru kita menganggap kompie tersebut mati
>
> saya sudah membuat memakai alarm()
> tetapi pada selang waktu tertentu
> dia akan kembali lagi mengulang kode yang diinterupt dgn alarm
>
> misal :
> signal(SIGALRM, fungsihandler);
> alarm(2)
> recvfrom(.....)
>
>
> ketika sudah 2 detik ia akan ke fungsihandler
> kemudian saya memanggi program lain lewat fungsi handler
> namun tiba-tiba ia kembali lagi ke recvfrom
>
> ketika di 'ltrace' keluar
> <... recvfrom resumed> )
recvfrom ini ngeblock. Jadi pas signal handler telah dieksekusi, akan balik
lagi ke recvfrom dan nerusin blockingnya.
Ada 2 cara untuk recvfrom nggak nerusin blocking:
1. Kalo mau pake signal, mesti pake "sigsetjmp", lalu manggil "siglongjmp"
di signal handler.
Jadi kira2 seperti ini:
----
static sigjmp_buf jmpbuffer;
void fungsihandler(int signum)
{
siglongjmp(jmpbuffer, 1);
return;
}
int main(void)
{
...
int timeout = 0;
// akan dipanggil kalo siglongjmp dieksekusi - kayak "goto"
if (sigsetjmp(jmpbuffer, 1) != 0) {
timeout = 1;
}
if (timeout)
return(1);
signal(SIGALRM, fungsihandler);
alarm(...);
...
// blocking, tapi pas signal handler dipanggil, sigsetjmp akan
// dieksekusi
recvfrom(...);
...
}
----
2. Yg satunya pake socket option "setsockopt" lalu di set timeout value nya.
---
int main(void)
{
...
int sock;
struct timeval t;
// set timeout
t.tv_sec = 10; // 10 detik
t.tv_usec = 0;
...
sock = sokcet(...);
// set socket option dengan timeout ot receive
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t));
...
if (recvfrom(...) < 0)
if (errno == EWOULDBLOCK)
// kena timeout
}
Semoga berguna :)
Andrew...
>
> Semoga ada yang bisa membantu :)
>
> Wasalamu 'alaikum Wr. Wb.
> ----------------------------------------------
> Apa yang hilang darimu pasti ada gantinya
> Tapi jika 4JJI meninggalkanmu siapa yang akan menggantikan-Nya
>
> --
> Berhenti langganan: [EMAIL PROTECTED]
> Arsip dan info: http://linux.or.id/milis.php
--
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis.php