Hi,

bayufa wrote:
Saya pernah bikin sniffer ..tapi di Windows
konsepnya sama seperti mas Andrew..
kita bisa menggunakan "bounded buffer"

namun , rasanya kok ada cara yg lebih mudah ya
pake  API message queue di Linux saja..
tidak repot2 , harus bikin buffer dan sinkronisasi

Message queue ini bukan utk sinkronisasi, tapi utk komunikasi antar process atau IPC. Process nggak bisa share global data, jadi perlu IPC kayak pipe, fifo, message queue, dsb.

Bisa juga dipake dengan thread, tapi bukannya kelebihan
dari thread adalah mudahnya komunikasi/sharing lewat
global variable? Jadi nggak perlu IPC (atau minimum
dikurangin).

Juga message queue ini punya fitur kalo satu process nulis
data ke queue lalu terminate, data tersebut nggak bakal
hilang. Data itu ada di queue terus sampe ada process
lain yg mencomot dari queue. Kalo nggak ada yg nyomot,
message queue itu bakal ada terus dan bisa di hapus kalo
pake "ipcs" program.

IMHO, message queue ini kayaknya agak "repot" ngurusnya
karena mesti ngecheck ada nggak queue yg "nyantol" lalu
mesti dibersihkan.

Alternative lain sih pake FIFO. Tapi juga resehnya kalo
pake FIFO mesti readernya jalan dulu sebelon writernya.

Memang kalo pake message queue/fifo/pipe ini enaknya kalo
queue lagi kosong, coba ngebaca dari queue tersebut akan
nge-block. Ini agak mirip dengan bounded buffer dimana
thread akan nunggu (blocking) sampe ada data di queue.
Cuma bedanya bounded buffer juga bakal ngeblock kalo
buffernya penuh.

Saya rasa ini sih tergantung kebutuhan. Kalo pake thread
yah pake global variable dan sinkronisasi. Kalo pake
process mesti pake IPC dan mungkin perlu sinkronisasi juga.

Seperti motto Perl: "There's more than one way to do it" :-)

Salam,
Andrew...


capture_engine -----> queue ----> processor

----- Original Message -----
From: "Andrew Hadinyoto" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Sunday, February 13, 2005 4:35 PM
Subject: Re: [linux-programming] Thread di C/C++



Hi,

durung_lulus wrote:


memang sepertinya ada hubungan dengan time slice dari OS-nya, dan
sayangnya saya ngga tahu cara setting timeslice ini.  Kebetulan saya
make freebsd 5.1.

Sebenarnya permasalahan saya seperti ini, saya membuat 2 buah program.
program pertama adalah sniffer, yang selalu menyimpan packet yang datang
dari eth kedatabase/file/memory. Dan process ini harus meminimalisasi
packet loss, karena akan sangat berpengaruh pada program yang kedua.

Program yang kedua akan berjalan, jika sebuah koneksi telah berakhir dan
melakukan analisa koneksi yang berakhir tersebut. Berhubung pada tahap
ini processnya cukup banyak perhitungan matematis, maka jika menggunakan
loop program bagian pertama akan ketinggalan dalam menangkap paket, dan
dapat membuat program kedua salah dalam analisa.

Mungkin ada masukan gimana enaknya metode untuk invoke/signalling
program ke-2?

Anda perlu metode sinkronisasi "Producer/Consumer" atau dikenal juga sebagai "Bounded Buffer".

Intinya, anda pake semacam buffer, lalu buffer tersebut di sinkronisasi.
Program pertama sniff lalu datanya disimpan di buffer. Program kedua
ngebaca dari buffer tersebut.
Kalo buffer lagi kosong - program no. 2 di-block (berhenti)
Kalo buffer ada isisnya - program no. 2 disignal utk memprosess
Kalo buffer-nya penuh - program no. 1 di-block (mungkin dalam kasus
anda, sniffernya berhenti sniff dulu).

Utk thread, anda bisa lihat di: man pthread_cond_wait (dan kawan2)
Kalo pake interprocess communication: man sem_wait (dan kawan2)

Salam,
Andrew...



--
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