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

Kirim email ke