nktr-cp / webserv

Implementation of a simple HTTP server in C++
3 stars 0 forks source link

kqueue, kevent #13

Closed nktr-cp closed 3 months ago

nktr-cp commented 5 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に何を持たせるべきかを考え中、どのソケットに対してイベントが発生したのかはわかるようにする必要がある。

nktr-cp commented 5 months ago

Serverからのソケットか、Clientからのソケットかを判断できるようにしないといけない。 前者の場合acceptしてClientのソケットを作って、イベントに登録する。 後者の場合、リクエストをreadしてきて、パースする。