skip to main
|
skip to sidebar
Yine honeyd içinde olmazsa olmaz bir kütüphaneyi araştırma sonuçlarında bu libevent kodlarını sadece incelemekle kalmadım birazcık üzerinde denemeler de yaptım. Libevent bir dosya tanımlayıcısı üzerinde bir durumun gerçekleştiğinde ya da herhangi bir zaman aşımı olduğunda çalışması için geri çağrılan işlevleri çalıştırmayı sağlayan bir kütüphanedir. Neredeyse bütün işletim sistemlerinde derlenebilir. Çok farklı şekillerde durum kütüphanesini kullanmak mümkün. Nasıl mı?
1. Event notification : Her dosya tanımlayıcısını izlemek içindir. "event.h"
* event_set()
* event_add()
* event_del()
2. I/O Buffers : tampon giriş çıkışlarını otomatikleştirir. "event.h"
* evtimer_set()
* evtimer_add()
* evtimer_del()
3. Timers : belirli bir zaman süre sonra çalıştırılması için beklenen fonksiyonlar için özelleştirilmiştir. "event.h"
* evtimer_set()
* evtimer_add()
* evtimer_del()
4. Timeouts : timers ile aynı şekilde çalışır. "event.h"
* timeout_set()
* timeout_add()
* timeout_del()
5. Asynchronous DNS resolution : standart DNS çözümleme fonksiyonlarının yerine kullanılır. "evdns.h"
* evdns_init()
* evdns_resolve_ipv4()
* evdns_resolve_reverse()
6. Event-driven HTTP servers : Uygulama içine basit bir olay-dayalı HTTP sunucusu sağlar. "evhttp.h"
* evhttp_new()
* evhttp_bind_socket()
* evhttp_set_cb()
* evhttp_set_gencb()
7. A framework for RPC servers and clients : RPC sunucu ve kullanıcı oluşturmak için bir iskelet oluşturur. "evrpc.h"
1. Durum Bildirimi ( Event Notification )
Fonksiyonları:
struct event_base *
event_init();
Bu fonksiyon event API sini kullanmadan önce gerekli olan fonksiyondur bir libevent çalışma mantığında event_init() ile başlar event_dispatch() ile son bulur. event_base_new() fonksiyonu ile birlikte yeni bir event_base yapısı oluşturur ve global "current_base" olarak bunu tutar.
void
event_set(struct event *ev, int fd, short event, void (*fn)(int, short, void *), void *arg);
Bu fonksiyon event_add() ve even_del() fonksiyonlarının çağrılması için event yapısını hazırlar. parametre olarak gönderilen event yapısının içeriğini doldurur. event_init() ile oluşturulan current_base, parametre ile gönderilen fd, event, fn, arg parametreleri yapı içine atanır.
EV_READ, EV_WRITE, EV_TIMEOUT, EV_SIGNAL durumları ile "fd" dosya tanımlayıcısını işaret eder. bu tanımlamalar event.h içerisinde sayısal değerleriyle belirtilmiştir.Bunların dışında EV_PERSIST event_add ile eklenir ve event_del ile karşılaşana kadar kalıcılığı sağlar.
int
event_add(struct event *ev, struct timeval *tv); ev durumu için eğer bir timeval yapısı ile zaman belirlenmişse bu zaman sonra event_set() ile atanan fn fonksiyonu çalışmasını sağlar. eğer bir timeval yerine NULL atanırsa bir giriş yapılmasını bekler ve event_set() içine yazdığımız "short event" bayraklarına göre davranışı değişir. timeval yapısı sys/time.h dosyasında bulunur ve içerisinde saniye ve mikrosaniye tutulur.
int
event_dispatch(void);
süreçler döngüye girerler ve çalıştırılması için atanan fonksiyonlar istenilen tetikleme ile çalıştırılmaya hazır olurlar.
-------------------------------------------------------------------------------------------------
...
#include " event.h"
void callback1(int fd, short evtype, void *data)·
{
printf(" yaklaşık %d saniye sonra callback1 fonksiyonu çalıştı \n\n",(int)data);
}
void callback2(int fd, short evtype, void *data)·
{
printf(" yaklaşık %d saniye sonra callback2 fonksiyonunu çalıştı \n\n",(int)data);
}
int main()
{
struct event ev, ev2;
int fd = open("/var/log/messages", O_RDONLY);
struct timeval timevl,timevl2; //
timevl.tv_sec =2;
timevl.tv_usec=0;
timevl2.tv_sec=5;
timevl2.tv_usec=0;
event_init();
event_set(&ev, 0, EV_READ | EV_PERSIST , callback1, timevl.tv_sec);
event_set(&ev2, 0, EV_READ | EV_PERSIST , callback2, timevl2.tv_sec);
event_add(&ev, &timevl);
event_add(&ev2, &timevl2);
event_dispatch();
return 0;
}
--------------------------------------------------------------------------------------------------
Burada çıktı timeval da verilen saniyeye göre belirlenir. timevl 2 sn timevl2 5 sn olarak belirlendiği için önce callback1 fonksiyonu daha sonra da callback2 fonksiyonu çalışır. callback1 program çalıştıktan 2 sn sonra çalışmaya başlar daha sonra 3 saniye sonra callback2 çalışmaya başlar. ayarlanan zaman ilk çalışma anına göre belirlenen zamandır.
EV_READ girdi ile işlem
EV_WRITE hemen işlem
EV_TIMEOUT işlem yok
EV_PERSIST işlem yok
EV_READ | EV_TIMEOUT girdi ile işlem
EV_WRITE | EV_PERSIST hemen işlem ve sonsuza kadar
EV_READ | EV_PERSIST girdi ile sonsuza kadar işlem
e-posta listesi: http://monkeymail.org/mailman/listinfo/libevent-users
dökümanları : http://www.monkey.org/~provos/libevent/doxygen-1.4.3/index.html
0 yorum :
Yorum Gönder