static bool findInt(IntNode *node,int v){ bool result = false; if(node==0){ return false; } if(*node==v){ return true; } IntNode *n; if(*node <v){ n = node->getRight(); }else{ n= node->getLeft(); } return findInt(n,v); }
void waitForNetEvent(struct NSNet *ns, int timeout) { fd_set readfds, writefds, errfds; sock_t max_fd; struct timeval tv; struct NSNetConnectionController *nscc; struct NSNetBindHandlerInternal *bindHI; struct NSNetConnectionHandlerInternal *connectHI; struct NSNetReadHandlerInternal *readerHI; int retval; int i; readfds = ns->readfds; writefds = ns->writefds; errfds = ns->errfds; max_fd = ns->max_fd; tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000; retval = select(max_fd, &readfds, &writefds, &errfds, &tv); if (retval > 0) { // There are some fds ready int connErrno, connErrnoLen = sizeof(connErrno); for (i = 0; i < ns->max_fd; i+=1) { char buf[1024]; if (FD_ISSET(i, &readfds) && (readerHI = findInt(ns->readerMap, i))) { int len = read(i, buf, 1024); if (len > 0) readerHI->nsrh.bytesRead(readerHI->udata, buf, len); if (len == 0) { close(i); readerHI->nsrh.closed(readerHI->udata); removeFdAll(ns, i); removeReadHandlerInternal(ns, readerHI); } } if (FD_ISSET(i, &readfds) && (bindHI = findInt(ns->bindMap, i))) { int addrlen = sizeof(nscc->peer); nscc = calloc(sizeof(*nscc), 1); nscc->ns = ns; nscc->udata = bindHI->udata; nscc->fd = accept(i, (struct sockaddr *) &nscc->peer, &addrlen); setNSnonblocking(ns, nscc->fd); bindHI->nsb.success(bindHI->udata, nscc); } } for (i = 0; i < ns->max_fd; i+= 1) { if ((FD_ISSET(i, &writefds) || FD_ISSET(i, &errfds) || FD_ISSET(i, &readfds)) && (connectHI = findInt(ns->connectMap, i))) { if (getsockopt(connectHI->fd, SOL_SOCKET, SO_ERROR, &connErrno, &connErrnoLen) == 0) { switch(connErrno) { case ECONNREFUSED: connectHI->nsc.refused(connectHI->udata); removeConnectionHandlerInternal(ns, connectHI); break; case 0: nscc = calloc(sizeof(*nscc), 1); nscc->ns = ns; nscc->peer = connectHI->dest; nscc->fd = connectHI->fd; nscc->udata = connectHI->udata; removeConnectionHandlerInternal(ns, connectHI); connectHI->nsc.success(connectHI->udata, nscc); break; default: printf("Unhandled connErrno: %d\n", connErrno); exit(1); break; } return; } } } } }
bool IntSet::contain(int v){ return findInt(root,v); }