First create a new kqueue:
int kq=kqueue();
Now register your fd in kq:
struct kevent kev; kev.ident=your_fd; kev.flags=EV_ADD | EV_CLEAR; kev.filter=EVFILT_READ; kev.fflags=0; kev.data=0; kev.udata=&your_data; int res=kevent(kq,&kev,1,0,0,0);
Finally, wait for the data to arrive on your socket:
struct kevent res_kevs[5]; int res=kevent(kq,0,0,res_kevs,5,0);
After returning res_kevs[i].ident will contain a handle to your socket, res_kevs[i].data - the number of bytes ready to be read.
See man kevent for more information and features.
source share