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