Closed nktr-cp closed 3 months ago
kqueueを作成し、サーバーのソケットをイベントキューにpushする。 pushは、
EV_SET(&change, server_socket, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, (void *)user_data);
のようにEV_SETを用いる。
while (1) { struct kevent event; int nev = kevent(kq, NULL, 0, &event, 1, NULL); if (nev == -1) { perror("kevent"); throw; } else if (nev > 0) { // イベントが発生した場合の処理 // keventの最後の引数をNULLにしている場合、イベントが発生するまでブロックされる handle_event(&event); } }
上のwhileの中がイベント処理の一単位、処理したあとに次のイベント処理待ちにするためにwhile(1)がある。
struct kevent { uintptr_t ident; /* identifier for this event */ int16_t filter; /* filter for event */ uint16_t flags; /* general flags */ uint32_t fflags; /* filter-specific flags */ intptr_t data; /* filter-specific data */ void *udata; /* opaque user data identifier */ };
udataに何を持たせるべきかを考え中、どのソケットに対してイベントが発生したのかはわかるようにする必要がある。
Serverからのソケットか、Clientからのソケットかを判断できるようにしないといけない。 前者の場合acceptしてClientのソケットを作って、イベントに登録する。 後者の場合、リクエストをreadしてきて、パースする。
kqueueを作成し、サーバーのソケットをイベントキューにpushする。 pushは、
のようにEV_SETを用いる。
上のwhileの中がイベント処理の一単位、処理したあとに次のイベント処理待ちにするためにwhile(1)がある。
udataに何を持たせるべきかを考え中、どのソケットに対してイベントが発生したのかはわかるようにする必要がある。